Java ISO时间(8601)的意外输出
系统打印结果为(15705表示自1970年代以来的天数): 12/12/31 22:06:47调试统计时间测试:当前日期:周一至十二月三十一日 2012年夏令时22:06:47,时间间隔:50807153,小时数:14Java ISO时间(8601)的意外输出,java,date,iso8601,Java,Date,Iso8601,系统打印结果为(15705表示自1970年代以来的天数): 12/12/31 22:06:47调试统计时间测试:当前日期:周一至十二月三十一日 2012年夏令时22:06:47,时间间隔:50807153,小时数:14 您可以看到当前的小时数为21小时,但结果显示为14小时。Mon Dec 31 22:06:47 CST 2012是GMT时间的Mon Dec 31 14:06:47 2012,它是用于纪元开始的时区 换句话说,now.getTime()返回自1970年1月1日00:00:00 G
您可以看到当前的小时数为21小时,但结果显示为14小时。
Mon Dec 31 22:06:47 CST 2012
是GMT时间的Mon Dec 31 14:06:47 2012
,它是用于纪元开始的时区
换句话说,
now.getTime()
返回自1970年1月1日00:00:00 GMT以来使用不同时区的毫秒数。Mon-Dec 31 22:06:47 CST 2012
是Mon-Dec 31 14:06:47 2012
在GMT时间,这是用于纪元开始的时区
换句话说,now.getTime()
返回自1970年1月1日00:00:00 GMT和您使用不同时区以来的毫秒数。now.getTime()将以UTC毫秒为单位获取值,即GMT+0。
您显示的日志打印可能使用了系统时区,当时是22:06:47,可能不在英格兰附近:-)
另外,请使用date arithmatic类,因为它与您的代码不同,它会考虑闰年、闰秒和时区变化(这在UTC中不会发生,在任何其他区域中可能会出现mihg Thapen)现在。getTime()将以UTC毫秒为单位获取值,即GMT+0。
您显示的日志打印可能使用了系统时区,当时是22:06:47,可能不在英格兰附近:-)
此外,请使用date arithmatic类,因为它与您的代码不同,它会考虑闰年、闰秒和时区变化(UTC中不会发生这种情况,其他任何区域可能会出现这种情况)几乎肯定是时区问题。
date
类的许多方法都不推荐使用,因此,请改用Calendar
或gregorianalendar
。您不会遇到这个问题,因为它们是基于地区的。几乎可以肯定是时区问题。Date
类的许多方法都不推荐使用,因此请改用Calendar
或gregorianalendar
。你不会有这个问题,因为它们是基于地区的。谢谢你的帮助,确实是时区问题,我在中国,时区差大约8小时。谢谢你的帮助,确实是时区问题,我在中国,时区差大约8小时。
Date now = new Date();
long timeInterval = now.getTime() - (15705 * 24 * 60 * 60 * 1000L);
long hours = timeInterval / (60 * 60 * 1000L);
LOG.debug(String.format("current date:%s, timeInterval:%d,hours:%d",now.toString(),timeInterval, hours));