微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我遇到一种情况,来自用户查询可以搜索来自 2 个偏移量(CET 和 CEST)的日志

例如:在数据库搜索日志,从 2019-09-20T12:00:00.000+01:00 到 2019-10-20T12:00:00.000+02:00。

我还有当前时区与用户的偏移量:+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,ZoneOffset.UTC);
    ZonedDateTime forResponse = fromDatabase.withZoneSameInstant(zone);
    
    System.out.println(forResponse);

示例代码的输出为:

2020-05-25T01:34:45+02:00[欧洲/卢森堡]

由于我在一年中的夏季时间部分(五月)选择了一个日期,Java 选择偏移 +02:00,而不管我们目前处于标准时间 (+01:00) 的事实。

>

我以欧洲/卢森堡为例。 CET 和 CEST 是许多现在共享 +1 和 +2 偏移量的时区的通用名称,但在历史上有所不同,将来也可能有所不同,例如欧盟放弃夏令时。所以一定要选择最适合您的用户的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。