如果fromTime和toTime的偏移量发生了变化,如何处理DB日志搜索查询的时区偏移量发生变化



我有一个情况,从用户的查询可以从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的偏移量,但在历史上有所不同,将来也可能不同,例如当欧盟放弃夏令时时。所以一定要选择一个最适合你的用户的。

相关内容

最新更新