Scala读取YAML文件时日期值总减少1天的原因是什么?
问题原因分析
- 时区偏移导致日期差:YAML解析器默认会将
YYYY-MM-DD格式的内容自动识别为UTC时区的日期对象,解析时默认取UTC当天的0点。你输出时使用的是EST时区(美国东部标准时间,属于UTC-5时区),UTC时间的2020-02-25 00:00:00减去5小时,对应EST时间就是2020-02-24 19:00:00,因此会出现日期少1天的现象。 - 无效日期自动修正:你输入的
2020-02-30属于无效日期,YAML的日期解析逻辑会自动将其修正为当月最后一天(2020年为闰年,2月最后一天为29日),因此解析为UTC时间的2020-02-29 00:00:00,转换为EST时间后就是你看到的Sat Feb 29 19:00:00 EST 2020。
解决方案
- 强制日期按字符串解析:在YAML文件中给日期值加英文引号,写成
date: "2020-02-25",解析器就不会自动做日期类型转换,你可以拿到原始字符串后自行按照目标时区做日期转换。 - 调整YAML解析器配置:修改你所用的YAML库的配置,要么禁用自动日期类型推断功能,要么将解析默认时区设置为你需要的EST时区,保证解析和输出的时区一致。
- 输出时统一时区格式:拿到解析后的日期对象后,不要直接调用默认
toString方法打印,而是指定EST时区做格式化输出,避免默认时区带来的偏移。
内容的提问来源于stack exchange,提问作者Glarixon
相关产品推荐
相关产品推荐

