问题描述
我有这个开始日期时间:“ 20201023T200457Z”(似乎是UTC0000) 如何在移动设备上使用本地时间的“ yyyyMMdd HH:mm:ss”模式转换/生成它?
我得到这个结果:星期五十月23 20:04:57 GMT + 02:00 2020 使用以下代码:
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'",Locale.getDefault());
Date startGMTInput = df.parse(start);
Log.e(TAG,"start: " + startGMTInput.toString());// -> Fri Oct 23 20:04:57 GMT+02:00 2020
但是我的目标是:2020-10-23 22:04:57 //因为我处于GMT + 2时区
解决方法
java.time(通过重复使用或ThreeTenABP
考虑使用java.time(现代Java日期和时间API)进行日期和时间工作。首先定义所需的格式化程序:
private static final DateTimeFormatter inputFormatter
= DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmssX");
private static final DateTimeFormatter outputFormatter
= DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
(DateTimeFormatter
是线程安全的,因此我们可以安全地将它们声明为静态。)明确进行时区转换:
String startString = "20201023T200457Z";
Instant start = inputFormatter.parse(startString,Instant.FROM);
String target = start.atZone(ZoneId.systemDefault()).format(outputFormatter);
System.out.println(target);
在我的时区中输出(当前与您所在的时区+02:00偏移):
20201023 22:04:57
问题:java.time是否不需要Android API级别26?
java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6 。
- 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。仅在这种情况下,使用方法引用
Instant::from
而不是常量Instant.FROM
。 - 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
- 在较旧的Android上,请使用废除旧书或Android版本的ThreeTen Backport。称为ThreeTenABP。在后一种情况下,请确保使用子包从
org.threeten.bp
导入日期和时间类。
链接
- Oracle tutorial: Date Time解释如何使用java.time。
- Java Specification Request (JSR) 310,其中首先描述了
java.time
。 - ThreeTen Backport project,即
java.time
向Java 6和7(JSR-310的ThreeTen)的反向端口。 - Java 8+ APIs available through desugaring
- ThreeTenABP,Android版本的ThreeTen Backport
- Question: How to use ThreeTenABP in Android Project,其中有非常详尽的解释。
在进行任何日期操作之前,将您的时区设置为GMT + 2。
isoFormat.setTimeZone(TimeZone.getTimeZone("GMT+2"));