我有一个情况,从用户的查询可以从2个偏移量(CET和CEST)来搜索日志
例如:从2019-09-20T12:00:00.000+01:00到2019-10-20T12:00:00.000+02:00的DB搜索日志
我也有用户的当前时区偏移量:+02:00。
日志以UTC格式存储在DB中。现在我可以将fromtime和totime转换为UTC并搜索日志
如下:
DateTimeFormatter RFC_3339_DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.optionalStart()
.appendOffset("+HH:MM", "Z")
.optionalEnd()
.toFormatter();
String dateTimeString = "2019-09-20T12:00:00.000+01:00";
ZonedDateTime zonedDateTime = ZonedDateTime.from(RFC_3339_DATE_TIME_FORMATTER.parse(dateTimeString));
//Convert to UTC
ZonedDateTime zoneDateTimeUtc = zonedDateTime.withZoneSameInstant(ZoneOffset.UTC);
log.info(zoneDateTimeUtc.toString());
但是问题是如何在响应中显示日期时间?
简单选项:将所有日志转换为用户的当前偏移量(+02:00)并发送。
但是:这并不代表正确的信息,因为有些日志属于较旧的偏移量。
如何处理这种情况?如果还有问题,请告诉我。
我相信用户会很高兴看到根据夏时制(DST)是否在一年中的某个时间有效的偏移量(+1或+2)。Java知道时区和夏令时,当您知道如何转换时,转换就很简单了:
ZoneId zone = ZoneId.of("Europe/Luxembourg");
ZonedDateTime fromDatabase
= ZonedDateTime.of(2020, 5, 24, 23, 34, 45, 0, ZoneOffset.UTC);
ZonedDateTime forResponse = fromDatabase.withZoneSameInstant(zone);
System.out.println(forResponse);
示例代码的输出为:
2020 - 05 - 25 - t01:34:45 + 02:00(欧洲/卢森堡)
由于我选择的日期是一年中的夏季时间(5月),Java选择了偏移量+02:00,而不管我们当前处于标准时间(+01:00)。
我以欧洲/卢森堡为例。CET和CEST是许多时区的通用名称,它们现在共享+1和+2的偏移量,但在历史上有所不同,将来也可能不同,例如当欧盟放弃夏令时时。所以一定要选择一个最适合你的用户的。