【问题标题】:How to make work SimpleDataFormat with summer time?如何在夏令时使用 SimpleDateFormat?
【发布时间】:2019-09-01 11:10:41
【问题描述】:

我从服务器获取了 iso8601 格式的日期 serverTimeDateFormat.parse("2019-04-10T16:04:14.677Z") 当我解析日期时,它给出了与我的位置相对应的时间,但它晚了 1 小时(GMT+1,而它是 GMT+2) 解决方案是什么?我怎么能认为已经切换到夏令时,但它仍然是基于冬令时计算的

【问题讨论】:

  • 顺便考虑扔掉长期过时且臭名昭著的麻烦SimpleDateFormat和朋友,并将ThreeTenABP添加到您的Android项目中,以便使用java.time,现代Java日期和时间API .使用起来感觉好多了。
  • 恐怕解决方法是正确解析字符串!尾随 Z 是距 UTC 的 0 偏移量。如果您这样传递它并转换为正确的时区(例如,欧洲/柏林)(使用 java.time)或确保您的 SimpleDateFormat(我不想使用)设置了正确的时区,其余的都是自动的。哪些时区有夏令时 (DST),哪些日期之间是 Java 内置的,不需要您(应用程序程序员)特别注意。
  • Java set timezone does not default to gmt+0 可能几乎重复。不过,该问题并未处理原始字符串中的“Z”。

标签: java android simpledateformat


【解决方案1】:

java.time 和 ThreeTen 反向移植

    ZoneId myTimeZone = ZoneId.of("Europe/Bratislava");
    DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG)
            .withLocale(Locale.forLanguageTag("sk-SK"));

    String serverDateTimeString = "2019-04-10T16:04:14.677Z";
    Instant dateTime = Instant.parse(serverDateTimeString);
    String formattedWithSummerTime = dateTime.atZone(myTimeZone)
            .format(formatter);
    System.out.println(formattedWithSummerTime);

这个 sn-p 的输出是:

  1. 2019 年 4 月 18:04:14 SELČ

即使你不会说斯洛伐克语,你也能认出16:04:14的服务器时间已按要求转换为18:04:14,即GMT+2。当然,您只需替换您自己的时区和您自己的语言环境即可。

哪些时区有夏令时 (DST),哪些日期之间的日期已内置到 Java 中,您(应用程序程序员)无需特别注意。许多欧洲时区(和一个非洲时区)通常是 GMT+1,而夏季时间是 GMT+2,所以我只选择了其中一个作为说明。

我非常有意识地避免使用您在问题中提到的SimpleDateFormat 类(尽管它也知道时区和夏令时并且可以在这里使用)。这个类是出了名的麻烦,幸运的是已经过时了。相反,我使用的是现代 Java 日期和时间 API java.time。

那么,您的代码出了什么问题?你还没有展示它,所以我不知道,但一个可能的怀疑是你没有正确解析服务器字符串。 Z 表示 UTC,但程序员有时将其视为文字,因此 SimpleDateFormat 不知道解析后的字符串是 UTC,从而导致时间不正确。

问题:我可以在 Android 上使用 java.time 吗?

是的,java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6。

  • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
  • 在 Java 6 和 7 中获得 ThreeTen Backport,这是现代类的后向端口(JSR 310 的 ThreeTen;请参阅底部的链接)。
  • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

链接

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2012-07-06
    • 2012-05-22
    • 2011-08-08
    • 2022-10-16
    • 2014-04-30
    • 2015-02-04
    • 2019-09-09
    相关资源
    最近更新 更多