如何解决笨拙的Java Date创建行为
| 因此,当我尝试创建两个日期时,我遇到了Java Date类的一个非常奇怪的行为:Date startDate = new Date(1282863600000L);
System.out.println(startDate);
Date endDate = new Date(1321919999000L);
System.out.println(endDate);
输出分别是:
2010年8月27日星期五00:00:00 BST
2011年11月21日星期一23:59:59 GMT
有人看到过类似的东西吗?两个日期都以相同的方式初始化,但是在打印时,第一个日期显示在BST中,而第二个日期显示在GMT中?
我试图找到有关的解释,但没有。有人能帮我吗?
提前致谢!
解决方法
这是记录的行为。
从
Date.toString()
:
将此Date对象转换为以下形式的字符串:
dow mon dd hh:mm:ss zzz yyyy
zzz
是时区(可能反映夏令时)。标准时区缩写包括方法解析识别的缩写。如果没有时区信息,则“ 3”为空-也就是说,它根本不包含任何字符。
您正在使用使用英国夏令时的语言环境,并创建一个适用夏时制规则的日期。这将是当时本地用户的预期日期格式。
, 对我来说,这段代码的输出是
2010年8月27日星期五,CEST 01:00:00
2011年11月22日,星期二00:59:59
确切结果取决于Java在系统上使用的默认语言环境。
区别在于CEST是欧洲中部的夏季时间,而CET是欧洲中部的时间(即不是夏季时间)。
您似乎在英国语言环境(en_GB
或类似的语言)中运行,因此您的输出分别显示英国夏令时和格林威治标准时间。
您指定的第一个日期属于相应的夏季时间,第二个则不是。因此,Java为每种语言环境/时间组合选择合适的时区。
, 在尝试了不同的long
值之后,我得到了以下内容:
Date startDate1 = new Date(1284245999999L);
Date startDate2 = new Date(1284246000000L);
System.out.println(startDate1);
System.out.println(startDate2);
Date endDate = new Date(1321919999000L);
System.out.println(endDate);
输出为:
Sun Sep 12 01:59:59 IDT 2010
Sun Sep 12 01:00:00 IST 2010 <-- Long value is greater,but due to DST changes,actual time is one hour earlier
Tue Nov 22 01:59:59 IST 2011
请注意,由于从标准时间到夏令时的过渡,将long的长度从ѭ10增加到ѭ11会增加1
。
这就是Java时间计算的方式-自1970年1月1日以来的毫秒数没有改变,但是它表示的时间基于时区。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。