如何使用夏季工作SimpleDateFormat?

问题描述 投票:0回答:1

当我解析它给出与我的位置相对应的时间的日期时,我从iso8601格式serverTimeDateFormat.parse("2019-04-10T16:04:14.677Z")的服务器获取日期,但它落后1小时(GMT + 1,而它是GMT + 2)这是什么解决方案?我如何才能考虑转换到夏令时,但仍然根据冬季时间计算

java android simpledateformat
1个回答
1
投票

java.time和ThreeTen Backport

    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);

此代码段的输出是:

  1. 2019年4月18:04:14 CEST

即使您不说斯洛伐克语,您也可以认识到16:04:14的服务器时间已经转换为18:04:14,即GMT + 2。当然,您只需替换自己的时区和自己的区域设置。

哪些时区具有夏令时(DST),其中日期在Java中构建,并且不需要您(应用程序员)的特别关注。许多欧洲时区(以及一个非洲时区)通常在GMT + 1和GMT + 2夏季时间,因此我选择了其中一个用于说明。

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

那你的代码出了什么问题呢?你没有显示它,所以我不知道,但可能的怀疑是你没有正确解析服务器字符串。 Z表示UTC,但程序员有时会将其作为文字,因此SimpleDateFormat不知道解析后的字符串是UTC,这会导致错误的时间。

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

是的,java.time适用于较旧和较新的Android设备。它至少需要Java 6。

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

链接

© www.soinside.com 2019 - 2024. All rights reserved.