首页 > 其他分享 >夏令时问题分析及最佳解决方案

夏令时问题分析及最佳解决方案

时间:2024-11-19 20:43:14浏览次数:3  
标签:String format 解决方案 夏令时 最佳 Date 时区 GMT

问题:

中国从1986年到1991年的六个年度曾实施过夏令时,在夏令时区间,Asia/Shanghai和GMT+8这两种不同的时区格式表示同一个时间时,会有1个小时的误差。

原因分析


1、时区信息配置不一致导致。比如linux服务器的默认时区,K8S容器配置的默认时区,数据库设置的默认时区等。比如服务器的时区为:‘Asia/Shanghai’,而在jdbcUrl中指定的数据库使用的时区是GMT+8 


2、String和Date 互转时,指定的时区不一致导致。GMT+8 因为没有位置信息,所以无法使用夏令时;而Asia/Shanghai 这种时区却使用了夏令时(详情可参考:https://alphahinex.github.io/2021/10/31/difference-between-gmt-plus-8-and-asia-shanghai/)

过程复现:

我们先用Asia/Shanghai把String反序列化成Date,然后再用GMT+8序列化回String,最终产生1小时的时差。

比如:定义如下UserDTO ,包含日期类型的字段:生日

@JsonFormat(pattern = "yyyy-MM-dd")
private Date birthDay;

假定传递birthDay的值为:1990-06-13。

将json串反序列化为对象,逻辑如下:

UserPO userPO = JSON.parseObject(userStr,UserPO.class);

此时可以看到。birthDay的日期为CDT格式。具体如下:

携带时区信息如下:

此时,如果数据库配置的时区为GMT-8,则此数据落库时,就会造成日期少一天。

而如果我们的工程里,配置默认时区为:GMT-8,则同样反序列化,看到效果是:

所以,对于日期字段和String类型互转时,要特别注意夏令时的问题。

我们还可以延伸到其他场景:

1.从mongodb查询数据时。一般来说,mongodb 底层默认统一使用UTC时间,但转换到java对象时,使用了LocalDate类型,如果时区没有统一配置,也可能出现夏令时问题。

2.使用SimpleDateFormat 进行日期转换时。

代码示例:

public static Date parse2Date(String str, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
//        format.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        try {
            return format.parse(str);
        } catch (Exception ex) {
            throw new IllegalArgumentException(ex);
        }
    }
 
    public static String parse2Str(Date date , String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
//        format.setTimeZone(TimeZone.getTimeZone("GMT+8"));
        try {
            return format.format(date);
        } catch (Exception ex) {
            throw new IllegalArgumentException(ex);
        }
    }

总结:

开发代码时,接口的出入参、日期转换时,如果所有的时区配置都遵从一种标准,则无论是系统内部日期转换还是上下游的系统调用,夏令时问题将不复存在。

比如,统一加入如下配置类:

@Configuration
public class GlobalZoneConfig {
    @PostConstruct
    public void init(){
        TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
    }
}

最佳实践:

整个研发团队采用统一的规范,比如:

1.接口层返回出参,如果有日期类型,建议统一为String类型(无论提供给其他微服务、还是前端)

2.接口层定义入参的日期格式(yyyy-MM-dd)时,建议为String类型(保证入口的参数是正确的日期,即不存在多一天或者少一天的情况)。

3.推荐统一用一种类型接收db数据(要么是String类型,要么是Date类型)。

标签:String,format,解决方案,夏令时,最佳,Date,时区,GMT
From: https://blog.csdn.net/liuyatao_/article/details/143863440

相关文章

  • 企业信息化:用友U8数据集成到旺店通的最佳实践
    用友U8采购入库单数据集成到旺店通·企业奇门的技术案例分享在企业信息化管理中,数据的高效流转和准确对接是业务顺畅运行的关键。本文将聚焦于一个实际案例,展示如何通过轻易云数据集成平台,将用友U8系统中的采购入库单数据无缝集成到旺店通·企业奇门平台,实现B111u8采购入库单(分......
  • Vscode Mingw64抢夺Python路径的解决方案
    VscodeMingw64抢夺Python路径的解决方案系统:Windows11时间:2024/11/19环境:Vscode:版本1.95.3   Python扩展:v2024.20.0   Mingw64:version5.2.37(1)-release(x86_64-pc-msys)说明首先说明一下什么叫抢夺路径:本人在今天再次运行一个此前运行过的python程序......
  • Web3.0安全开发实践|钻石代理合约最佳安全实践
    代理合约是智能合约开发者的重要工具。如今,合约系统里已有多种代理模式和对应的使用规则。我们之前已经概述了可升级的代理合约安全最佳实践。本文我们将介绍了另一种在开发者社区颇受青睐的代理模式,即钻石代理模式。什么是钻石代理模式/合约钻石代理合约,也被称为“钻石”,是......
  • 单元/集成测试解决方案
        在项目开发的前期针对软件单元/模块功能开展单元/集成测试,可以尽早地发现软件Bug,避免将Bug带入系统测试阶段,有效地降低HIL测试的测试周期,也能有效降低开发成本。单元/集成测试旨在证明被测软件实现其单元/架构设计规范、证明被测软件不包含非预期功能。经纬恒润测试团......
  • 萤石设备视频接入平台EasyCVR私有化部署视频平台智慧工地无线监控系统解决方案
    在建筑行业,工地的安全管理和环境监控是确保工程顺利进行的关键。随着智慧城市建设的推进和技术的发展,传统的工地管理模式已经无法满足现代建筑施工的需求。EasyCVR智慧工地无线监控系统解决方案针对车辆、人员出入口、塔吊、围墙边界、施工区、办公区、工人生活区、材料存放区等......
  • 皮带跑偏识别智慧矿山一体机人员乘坐皮带识别提升矿山效率的智能化解决方案
    在矿业领域,随着科技的不断进步,智能化转型已成为提升矿山安全性、效率和可持续性的关键。智慧矿山一体机的问世,正是这一转型的体现,它专为矿山环境设计,集成了多种前沿技术,以实现矿山作业的智能化管理。本文将详细介绍皮带跑偏识别智慧矿山一体机如何通过其先进的功能和应用,为矿山行......
  • Java与大数据:二本硕士的最佳职业发展路径
    在当前激烈的就业环境下,二本院校的硕士生常常会陷入迷茫-是专注Java开发,还是投身大数据领域?经过多年的行业观察和实践,我想分享一个明确的答案:以Java为根基,再拓展大数据技术,这是一条稳健且高效的发展路径。作为亲历者和观察者,我看到太多求职者在技术选择上走了弯路。有的同学......
  • Spring Boot图书馆管理系统:疫情下的解决方案
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了疫情下图书馆管理系统的开发全过程。通过分析疫情下图书馆管理系统管理的不足,创建了一个计算机管理疫情下图书馆管理系统的方案。文章介绍了疫情下图书馆管理系统的系统分......
  • 你想了解的DDS协议解决方案在这里
        随着汽车电子电气架构快速演进,车企对车内网络通信性能、安全性、灵活性要求日益提升,车载总线通信技术也迎来革新挑战。在此背景下,DDS(DataDistributionService)凭借其高性能、高可靠和低延迟的特点,有力支撑了智能汽车系统的高效运行。    DDS协议凭借其在物联......
  • 检索增强生成(RAG)应用构建的最佳实践
    RAG,也就是检索增强生成,已经证明是个挺管用的招儿,能让大型语言模型(LLM)的回答更靠谱,还能搞定它们有时候会“幻觉”的问题。简单来说,RAG就是给LLM们提供了一些上下文,帮它们生成更准确、更符合上下文的回答。这些上下文可以来自各种地方,比如你的内部文件、向量数据库、CSV文件、JS......