2013-02-18 106 views
0

我无法理解java.sql.timestamp用夏令时分配java.sql.Timestamp

如果我运行java过时的构造函数:

java.sql.Timestamp(106,2,26,1,0,0,0) 
java.sql.Timestamp(106,2,26,2,0,0,0) 
java.sql.Timestamp(106,2,26,3,0,0,0) //<-- Separated by one hour 

我得到:发生

2006-03-26 01:00:00.0 
2006-03-26 03:00:00.0  
2006-03-26 03:00:00.0 //<--These last two are the same 

夏令(在我的国家至少)围绕这些时间。但时间前后的日期不会移动。为什么两个单独的小时同时返回?

我想得到时间戳就像我的输入,我该如何强制?

+2

从不使用不建议使用的构造函数开始。然后明白,由于夏令时,02:00:00和03:00:00代表同一时刻。 – 2013-02-18 14:24:53

+0

的确,似乎创建的对象(时间戳)不能在凌晨2点到凌晨3点之间取值。这在当地时间很好,但我的数据是CET(无夏令时),我需要在该时间间隔插入记录。 – user2074921 2013-02-18 16:55:33

+0

这个计算器发布了设置时区的说明:http://stackoverflow.com/a/10522783/445131 – 2013-03-19 13:30:00

回答

0

使用System.currentTimeMillis();为您提供了格林尼治标准时间,它不受夏令时,闰秒和其他对日期的突然调整的影响。

long now = System.currentTimeMillis(); 

或指定手动时区:

long ms = Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis(); 

来源:Get GMT Time in Java

1

,因为它使用的默认时区不使用这个过时的构造函数,而这恰恰是过时。

使用具有适当时区(CET)的日历(或日期格式),设置日历的字段(或解析包含要插入日期的字符串),从日历/日期获取毫秒,并从毫秒中构建一个时间戳。

+0

我试过了,但问题似乎仍然存在。如果我输入java.sql.Timestamp(1143334799999)''我得到'2006-03-26 01:59:59.999',而用'java.sql.Timestamp(1143334800000)'我得到'2006-03-26 03: 00:00.0' – user2074921 2013-02-19 11:08:44