我在 android 中遇到了日光问题,时间应该是+3 GMT/UTC,但我只得到+2。 有什么解决方案还是我无法处理? 请在下面找到我的代码
TimeZone.getDefault().useDaylightTime();
SimpleDateFormat df = new SimpleDateFormat("HH:mm",Locale.ENGLISH); //"2021-02-18T11:00:00"
df.setTimeZone(TimeZone.getTimeZone("UTC"));
return df.format(calendar.getTime());
请注意,DST 偏移量返回零。 我应该怎么处理日光? 我时间的另一个注意事项是约旦/安曼, 在冬天,它应该返回+2,但在夏天它应该返回+3
java.time
考虑使用 java.time(现代 Java 日期和时间 API)进行日期和时间工作。让我们首先为您想要的时间格式声明一个格式化程序:
private static final DateTimeFormatter TIME_FORMATTER
= DateTimeFormatter.ofPattern("HH:mm", Locale.ENGLISH);
现在,您可以通过以下方式格式化Calendar
的时间:
// Assume you are getting a Calendar from somewhere
Calendar calendar = new GregorianCalendar();
ZonedDateTime dateTime = calendar.toInstant().atZone(ZoneId.systemDefault());
String dateTimeString = dateTime.format(TIME_FORMATTER);
System.out.println(dateTimeString);
我刚才运行了代码,即 UTC 的 16:33 或约旦的 19:33。输出为:
19:33
如果您不依赖于从某个地方获得老式Calendar
,那么它可能更简单,更干净。例如,要获取您所在时区的当前时间,请执行以下操作:
String timeString
= LocalTime.now(ZoneId.systemDefault()).format(TIME_FORMATTER);
System.out.println(timeString);
您的代码中出了什么问题?
将SimpleDateFormat
的时区设置为 UTC。因此,无论您的默认时区如何,都会打印 UTC 时间。由于UTC没有夏令时(DST),因此没有考虑到这一点。
顺便说一句,你的这个方法调用什么都不做:
TimeZone.getDefault().useDaylightTime();
从文档中:
返回:
true
如果此TimeZone
使用夏令时,false
, 否则。
因此,该方法不会更改任何内容,当然也不会更改UTC时区。它仅查询提到的时区是否使用夏令时(夏令时)。因此,由于亚洲/安曼时区确实如此,因此在您的情况下,它应该返回true
。
问:java.time 不需要 Android API 级别 26 吗?
java.time在较旧和较新的Android设备上都能很好地工作。它只需要至少Java6。
- 在 Java 8 及更高版本以及较新的 Android 设备(从 API 级别 26)中,内置了现代 API。
- 在非Android Java 6和7中,获得ThreeTen Backport,现代类的反向移植(JSR 310的ThreeTen;请参阅底部的链接)。
- 在较旧的Android上使用脱糖或Android版本的ThreeTen Backport。它被称为ThreeTenABP。在后一种情况下,请确保从带有子包的
org.threeten.bp
导入日期和时间类。
链接
- Oracle 教程:日期时间解释如何使用 java.time。
- Java 规范请求 (JSR) 310,其中首次描述了
java.time
。 - ThreeTen Backport 项目,将
java.time
向 Java 6 和 7 的反向移植(ThreeTen 用于 JSR-310)。 - 通过脱糖提供 Java 8+ API
- ThreeTenABP,ThreeTen Backport 的安卓版
- 问:如何在Android项目中使用ThreeTenABP,并进行了非常详尽的解释。