提问人:BBMM 提问时间:9/9/2021 最后编辑:Ryan MBBMM 更新时间:9/11/2021 访问量:133
通过 joda 更改日期时间不起作用 - 没有错误消息,时间保持不变 [重复]
Change Datetime by joda does not work- no error message and Time remains unchanged [duplicate]
问:
我想使用下面的代码使用 joda Datetime 在我的 android 应用程序中更改日期时间。 步骤:
- 获取系统的当前日期
- 设置系统小时数
- 获取当前日期并检查结果。
运行此应用程序时没有错误弹出窗口。 但时间没有改变。
我有什么遗漏的吗? 我是否需要在清单 .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'
}
答:
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,请从时钟中抽出一个并转换:Date
Instant
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
链接
- Oracle 教程:解释如何使用 java.time 的日期时间。
- Java 规范请求 (JSR) 310,其中首次被描述。
java.time
- ThreeTen 向后移植项目,向后移植到 Java 6 和 7(ThreeTen 用于 JSR-310)。
java.time
- Java 8+ API 可通过脱糖获得
- ThreeTenABP,ThreeTen Backport 的 Android 版本
- 问:如何在Android Project中使用ThreeTenABP,解释非常详尽。
评论
0赞
BBMM
9/15/2021
非常感谢您的详细建议。我尝试使用Clock.systemdefaultZone(),但我的应用程序立即停止工作(应用程序崩溃)。我不确定如何解决这个问题
0赞
Anonymous
9/15/2021
很抱歉阅读。我想知道如果你使用它,它是否会成为脱糖的限制,但我不确定,这只是一个想法。我只在桌面 Java 上测试了我的代码。我自己不是 Android 开发人员,也没有机会在 Android 上进行测试。
评论
java.util
android.permission.SET_TIME
AlarmManager
Context.getSystemService(Context.ALARM_SERVICE)
setTime()