当我解析它给出与我的位置相对应的时间的日期时,我从iso8601格式serverTimeDateFormat.parse("2019-04-10T16:04:14.677Z")
的服务器获取日期,但它落后1小时(GMT + 1,而它是GMT + 2)这是什么解决方案?我如何才能考虑转换到夏令时,但仍然根据冬季时间计算
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);
此代码段的输出是:
- 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,这会导致错误的时间。
是的,java.time适用于较旧和较新的Android设备。它至少需要Java 6。
org.threeten.bp
导入子包的日期和时间类。java.time
首次被描述。java.time
的后端到Java 6和7(JST-310的ThreeTen)。