巴西利亚夏令时过渡时间为2037-10-18

fei
TimeZone.setDefault(TimeZone.getTimeZone("BET"));
Locale.setDefault(Locale.ENGLISH);

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS zzzz");

Date d0 = sdf1.parse("2037-10-17 23:00:00.000");
Date d1 = sdf1.parse("2037-10-17 23:00:00.001");
Date d2 = sdf1.parse("2037-10-17 23:59:59.999");
Date d3 = sdf1.parse("2037-10-18 00:00:00.000");
Date d4 = sdf1.parse("2037-10-18 00:00:00.001");
Date d5 = sdf1.parse("2037-10-18 00:59:59.999");
Date d6 = sdf1.parse("2037-10-18 01:00:00.000");
Date d7 = sdf1.parse("2037-10-18 01:00:00.001");
Date d8 = sdf1.parse("2037-10-18 01:59:59.999");
Date d9 = sdf1.parse("2037-10-18 02:00:00.000");

System.out.println(sdf2.format(d0) + "(" + d0.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d0) + ", offset: " + TimeZone.getDefault().getOffset(d0.getTime()));
System.out.println(sdf2.format(d1) + "(" + d1.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d1) + ", offset: " + TimeZone.getDefault().getOffset(d1.getTime()));
System.out.println(sdf2.format(d2) + "(" + d2.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d2) + ", offset: " + TimeZone.getDefault().getOffset(d2.getTime()));
System.out.println(sdf2.format(d3) + "(" + d3.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d3) + ", offset: " + TimeZone.getDefault().getOffset(d3.getTime()));
System.out.println(sdf2.format(d4) + "(" + d4.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d4) + ", offset: " + TimeZone.getDefault().getOffset(d4.getTime()));
System.out.println(sdf2.format(d5) + "(" + d5.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d5) + ", offset: " + TimeZone.getDefault().getOffset(d5.getTime()));
System.out.println(sdf2.format(d6) + "(" + d6.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d6) + ", offset: " + TimeZone.getDefault().getOffset(d6.getTime()));
System.out.println(sdf2.format(d7) + "(" + d7.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d7) + ", offset: " + TimeZone.getDefault().getOffset(d7.getTime()));
System.out.println(sdf2.format(d8) + "(" + d8.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d8) + ", offset: " + TimeZone.getDefault().getOffset(d8.getTime()));
System.out.println(sdf2.format(d9) + "(" + d9.getTime() + "), dst: " + TimeZone.getDefault().inDaylightTime(d9) + ", offset: " + TimeZone.getDefault().getOffset(d9.getTime()));

输出

2037-10-17 23:00:00.000 Brasilia Time(2139444000000), dst: false, offset: -10800000
2037-10-17 23:00:00.001 Brasilia Time(2139444000001), dst: false, offset: -10800000
2037-10-17 23:59:59.999 Brasilia Time(2139447599999), dst: false, offset: -10800000
2037-10-18 01:00:00.000 Brasilia Summer Time(2139447600000), dst: true, offset: -7200000
2037-10-18 00:00:00.001 Brasilia Time(2139447600001), dst: true, offset: -10800000
2037-10-18 00:59:59.999 Brasilia Time(2139451199999), dst: true, offset: -10800000
2037-10-18 01:00:00.000 Brasilia Summer Time(2139447600000), dst: true, offset: -7200000
2037-10-18 00:00:00.001 Brasilia Time(2139447600001), dst: true, offset: -10800000
2037-10-18 00:59:59.999 Brasilia Time(2139451199999), dst: true, offset: -10800000
2037-10-18 02:00:00.000 Brasilia Summer Time(2139451200000), dst: true, offset: -7200000

该代码打印出“巴西利亚时间2037-10-18 00:00:000”附近的日期时间,结果表明“巴西利亚时间2037-10-18 00:00:000”应为“ 2037-10-” 18 01:00:00.000巴西利亚夏令时”,表示巴西利亚当时已进入夏令时。

我的问题是,为什么在“ 2037-10-18 00:00:00.001巴西利亚时间”和“ 2037-10-18 00:59:59.999巴西利亚时间”之间,时区偏移仍使用标准时间偏移。这是JDK时区数据的错误还是该时区实际上是以这种方式工作。

我的代码使用offset来确定两个日期之间是否存在dst过渡。显然,“ 2037-10-18 01:00:00.000巴西利亚夏令时”和“ 2037-10-18 00:59:59.999巴西利亚时间”这两个日期在这里不起作用。

我可以更改为使用“ TimeZone.getDefault()。inDaylightTime(Date date)”来确定是否存在过渡,但是我仍然想知道这是否是JDK的错误。

汤玛士

我试图用调试器逐步检查代码,这似乎是时区和开关本身的问题:BRT到BRST在午夜从00:00:00切换到01:00:00,这意味着实际上在这两个小时之间不存在。

从我的调试中,问题似乎GregorianCalendar#computeTime()尤其在以下几行中:

millis -= zoneOffsets[0] + zoneOffsets[1];

从该行开始millis的时间是从分析日期算起的自纪元以来的时间,并且该时间与00:00:00(213946800000)和01:00:00(2139440400000)不同。在两种情况下zoneOffsets[0]均为-10800000,这是UTC的原始偏移量。

区别在于zoneOffsets[1]:为00:00:000,但为01:00:003600000,即1小时。造成这种情况的原因似乎是内部调用,inDaylightTime( new Date(millis) )其对00:00:00(dst前)返回false,但对于01:00:00(dst的第一个小时返回true 因此,最终时间将是相同的,因为您总是添加10800000毫秒,但从较高的值中减去3600000毫秒,即较高的值是3600000毫秒:)

最后,您将获得Date相同的毫秒时间。

再次格式化日期时,似乎格式化程序将对照时区检查毫秒时间,并且每一次对应于00:00:00,000 - 59:59:59,999,即在两个时区中都可能被假定为dstOffset0而不是3600000,因此时区不同被打印。

编辑:比较时01:00:00.00001:00:00.001似乎有一个错误,ZoneInfo.getOffsets(time, offsets, type)其中前者返回dst偏移量为360000 后者返回0,而在格式化程序中填充日历字段时,两者都将假定为dst。

编辑2:更改解析器格式以接受时区快捷方式时,您可以观察到相同的行为,即00:00:00.000 BRT01:00:00.000 BRST被解析为2139447600000并再次格式化为01:00:00.000 BRSTwhile00:00:00.001 BRT01:00:00.001 BRST被解析为2139447600001并被格式化为00:00:00.001 BRT-这本身是正确的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

减少WSL安装的大小(在Windows 10上为Ubuntu 18)

来自分类Dev

如何计算(a * b * c * d / e)%mfa,b,c,d,e的阶数为10 ^ 18?

来自分类Dev

我将这种格式作为对象2020-11-18 10:36:29.772234 +0000 UTC,想要转换为日期时间

来自分类Dev

如何在MATLAB中创建模式为[1 2 5 6 9 10 13 14 17 18 ....]的向量?

来自分类Dev

在Python中将2e + 18转换为2x10 ^ 18

来自分类Dev

ValueError:无法将输入数组从形状(10,10)广播到形状(10,18)

来自分类Dev

ValueError:无法将输入数组从形状(10,10)广播到形状(10,18)

来自分类Dev

安卓。支持10-18英寸屏幕尺寸

来自分类Dev

升级后如何使用较新的 pip?(10 --> 18)

来自分类Dev

strptime-ValueError:时间数据'02 / 08/18 10:47:43,907000000'与格式'%d /%m /%Y%H:%M:%S,%f'不匹配

来自分类Dev

我编写了该程序,以查找给定的输入是否为2的幂,该程序未运行很大的数字,例如10 ^ 18左右。我该怎么办

来自分类Dev

ActiveRecord :: RecordNotFound(无法找到所有ID为(7、9、10、18、44、46、47、55)的歌曲(找到4个结果,但正在寻找8个结果):

来自分类Dev

Perl中的18位朱利安时间戳

来自分类Dev

节点使用2019年巴西夏令时

来自分类Dev

Windows 10自动夏令时调整不起作用?

来自分类Dev

Android中的日期格式从2016年4月18日10:41 AM到04/18/2016 10:41进行解析

来自分类Dev

时间前的言语i18n

来自分类Dev

时间前的言语i18n

来自分类Dev

比较 datenum 和 18 位时间戳

来自分类Dev

如何从SYSDATETIME()中减去18小时

来自分类Dev

l10n和i18n的Angular项目的最佳实践是什么?

来自分类Dev

1个线程需要2秒,10个线程需要16-18秒。为什么?

来自分类Dev

如何在C ++中计算A,B,C <= 10 ^ 18的(A * B)%C?

来自分类Dev

在我的REST API上实现Spring i18n和L10n

来自分类Dev

Django中的i18n和l10n具有不同的视图

来自分类Dev

在Windows 10上安装XAMPP / MAMP后,Microsoft SQL Server Management Studio 18无法启动

来自分类Dev

在Ubuntu 18主机上不带IP的虚拟盒子访客(Win 10 / Ubuntu最小)

来自分类Dev

react-i18next v10 没有钩子

来自分类Dev

win 10 32位无法安装Oracle数据库客户端18c

Related 相关文章

  1. 1

    减少WSL安装的大小(在Windows 10上为Ubuntu 18)

  2. 2

    如何计算(a * b * c * d / e)%mfa,b,c,d,e的阶数为10 ^ 18?

  3. 3

    我将这种格式作为对象2020-11-18 10:36:29.772234 +0000 UTC,想要转换为日期时间

  4. 4

    如何在MATLAB中创建模式为[1 2 5 6 9 10 13 14 17 18 ....]的向量?

  5. 5

    在Python中将2e + 18转换为2x10 ^ 18

  6. 6

    ValueError:无法将输入数组从形状(10,10)广播到形状(10,18)

  7. 7

    ValueError:无法将输入数组从形状(10,10)广播到形状(10,18)

  8. 8

    安卓。支持10-18英寸屏幕尺寸

  9. 9

    升级后如何使用较新的 pip?(10 --> 18)

  10. 10

    strptime-ValueError:时间数据'02 / 08/18 10:47:43,907000000'与格式'%d /%m /%Y%H:%M:%S,%f'不匹配

  11. 11

    我编写了该程序,以查找给定的输入是否为2的幂,该程序未运行很大的数字,例如10 ^ 18左右。我该怎么办

  12. 12

    ActiveRecord :: RecordNotFound(无法找到所有ID为(7、9、10、18、44、46、47、55)的歌曲(找到4个结果,但正在寻找8个结果):

  13. 13

    Perl中的18位朱利安时间戳

  14. 14

    节点使用2019年巴西夏令时

  15. 15

    Windows 10自动夏令时调整不起作用?

  16. 16

    Android中的日期格式从2016年4月18日10:41 AM到04/18/2016 10:41进行解析

  17. 17

    时间前的言语i18n

  18. 18

    时间前的言语i18n

  19. 19

    比较 datenum 和 18 位时间戳

  20. 20

    如何从SYSDATETIME()中减去18小时

  21. 21

    l10n和i18n的Angular项目的最佳实践是什么?

  22. 22

    1个线程需要2秒,10个线程需要16-18秒。为什么?

  23. 23

    如何在C ++中计算A,B,C <= 10 ^ 18的(A * B)%C?

  24. 24

    在我的REST API上实现Spring i18n和L10n

  25. 25

    Django中的i18n和l10n具有不同的视图

  26. 26

    在Windows 10上安装XAMPP / MAMP后,Microsoft SQL Server Management Studio 18无法启动

  27. 27

    在Ubuntu 18主机上不带IP的虚拟盒子访客(Win 10 / Ubuntu最小)

  28. 28

    react-i18next v10 没有钩子

  29. 29

    win 10 32位无法安装Oracle数据库客户端18c

热门标签

归档