通过 joda 更改日期时间不起作用 - 没有错误消息,时间保持不变 [重复]

Change Datetime by joda does not work- no error message and Time remains unchanged [duplicate]

提问人:BBMM 提问时间:9/9/2021 最后编辑:Ryan MBBMM 更新时间:9/11/2021 访问量:133

问:

我想使用下面的代码使用 joda Datetime 在我的 android 应用程序中更改日期时间。 步骤:

  1. 获取系统的当前日期
  2. 设置系统小时数
  3. 获取当前日期并检查结果。

运行此应用程序时没有错误弹出窗口。 但时间没有改变。

我有什么遗漏的吗? 我是否需要在清单 .xml 中获得更多权限?

请注意,该应用将在 root 权限的模拟器上运行。

我的文件如下:

主活动.java;

private void settime1(){

        List<String> text = new ArrayList<>();
    DateTime now = DateTime.now();
    Toast.makeText(MainActivity.this,now.toString(), Toast.LENGTH_LONG).show();
    text.add("Now: " + now);
    text.add("Now + 12 hours: " + now.plusHours(12));
    Date currentTime = Calendar.getInstance().getTime();
    Toast.makeText(MainActivity.this, currentTime.toString(), Toast.LENGTH_LONG).show();
    }

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.us_bbteam">

buid.gradle

dependencies {
    api 'joda-time:joda-time:2.10.9:no-tzdb'

    implementation "androidx.startup:startup-runtime:1.0.0"
    implementation 'androidx.annotation:annotation:1.1.0'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'com.google.android.material:material:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.navigation:navigation-fragment:2.3.5'
    implementation 'androidx.navigation:navigation-ui:2.3.5'
    implementation 'com.google.android.things:androidthings:1.0'
    implementation 'net.danlew:android.joda:2.10.9.1'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
安卓 android-jodatime

评论

0赞 Anonymous 9/10/2021
是的,我猜。现在在 Joda-Time 敌人中计算时间 12 小时不会改变手机的系统时钟。
0赞 BBMM 9/11/2021
谢谢你的链接。实际上是关于使用“su date”cmd 更改时间的链接。我试图遵循 cmd,但我的应用程序在执行 cmd 后立即崩溃。请注意,我已授予超级用户对应用程序的访问权限。
1赞 Arvind Kumar Avinash 9/12/2021
日期时间 API 已过时且容易出错。建议完全停止使用它并切换到新式日期时间 API。另外,请阅读 Joda-Time 主页上的以下声明: 请注意,从 Java SE 8 开始,用户被要求迁移到 java.time (JSR-310) - JDK 的核心部分,它取代了这个项目。我强烈建议您使用 Ole V.V. 提供的解决方案java.util
0赞 Ryan M 9/21/2021
你有没有看到“这是可能的,而且已经完成了。你需要。然后使用 via 及其方法 .“?android.permission.SET_TIMEAlarmManagerContext.getSystemService(Context.ALARM_SERVICE)setTime()

答:

1赞 Anonymous 9/11/2021 #1

java.time.时钟

考虑使用 java.time(现代 Java 日期和时间 API)进行日期和时间工作。java.time 还提供了一个可以配置为为您提供与当前实际时间不同的时间。Clock

    Clock offsetClock
            = Clock.offset(Clock.systemDefaultZone(), Duration.ofHours(12));
    
    ZonedDateTime offsetNow = ZonedDateTime.now(offsetClock);
    System.out.println(offsetNow);

当我刚才运行这个时——我所在时区的早上 6:38——我得到了:

2021-09-11T18:38:00.356242+02:00[欧洲/哥本哈根]

如果你需要一个老式的 API 对象,而你现在负担不起升级到 java.time,请从时钟中抽出一个并转换:DateInstant

    Date offsetOldfashionedDate = Date.from(Instant.now(offsetClock));
    System.out.println(offsetOldfashionedDate);

周六 9月 11 18:38:00 CEST 2021

问:java.time 不需要 Android API 级别 26 吗?

java.time 在较旧和较新的 Android 设备上都能很好地运行。它至少需要 Java 6

  • 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26 开始)上,内置了现代 API。
  • 在非 Android Java 6 和 7 中,获取 ThreeTen 向后移植,即现代类的向后移植(JSR 310 为 ThreeTen;请参阅底部的链接)。
  • 在较旧的 Android 上,要么使用脱糖,要么使用 Android 版的 ThreeTen Backport。它被称为 ThreeTenABP。在后一种情况下,请确保从子包中导入日期和时间类。org.threeten.bp

链接

评论

0赞 BBMM 9/15/2021
非常感谢您的详细建议。我尝试使用Clock.systemdefaultZone(),但我的应用程序立即停止工作(应用程序崩溃)。我不确定如何解决这个问题
0赞 Anonymous 9/15/2021
很抱歉阅读。我想知道如果你使用它,它是否会成为脱糖的限制,但我不确定,这只是一个想法。我只在桌面 Java 上测试了我的代码。我自己不是 Android 开发人员,也没有机会在 Android 上进行测试。