我无法在日光下获得正确的时区偏移量



我在 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,并进行了非常详尽的解释。

最新更新