Dart中millisecondsSinceEpoch为何受时区影响致CI测试失败
问题原因
两个返回值刚好相差3600000毫秒(整1小时),核心问题出在DateTime对象的构造逻辑上:
- 你在测试里写的
DateTime(2021, 1, 11)用的是默认构造函数,这个构造函数生成的是当前运行环境本地时区的时间,不是UTC时间。 - 你的本地开发环境和CI环境的时区配置差了1小时:同样传参
2021,1,11代表的本地零点,在两个时区下对应的实际UTC时间点差了整整1小时,自然调用millisecondsSinceEpoch得到的结果会差1小时。 - 官方文档说
millisecondsSinceEpoch和时区无关的描述没有错:这个属性永远返回时间点对应的UTC纪元毫秒数,但如果你构造DateTime时用的是本地时区模式,不同环境下同参数构造出来的对象根本不是同一个时间点,返回值自然不一致。
你给出的两个返回值完全符合这个逻辑:1610323200000对应UTC时区2021-01-11 00:00:00,是UTC环境下本地零点的毫秒值1610319600000对应UTC时区2021-01-10 23:00:00,是东一区(UTC+1)环境下本地零点的毫秒值
修复方法
把测试里构造固定日期的代码改成明确使用UTC构造函数,彻底屏蔽运行环境的时区影响:
// 原写法:生成本地时区时间,受环境时区配置影响 final testDate = DateTime(2021, 1, 11); // 修改后:生成UTC时间,任意环境下对应的时间点完全一致 final testDate = DateTime.utc(2021, 1, 11);
修改后所有环境下testDate.millisecondsSinceEpoch都会固定返回1610323200000,你把测试断言里硬编码的文件名对应毫秒值改成这个数,测试就能稳定在所有环境通过。
如果业务逻辑本身要求必须使用本地时间生成文件名,就不要在测试里硬编码毫秒值,应该在测试运行时动态读取当前环境的时区偏移计算预期值,避免绑定本地开发机的时区配置。
内容的提问来源于stack exchange,提问作者Stefano Saitta
相关产品推荐
相关产品推荐

