如何在两次之间没有时区的情况下获得差异?

时间:2011-07-27 09:07:49

标签: java datetime

在问题A very strange date before 1970中,我知道为什么两次看起来只有1的差异,但有时我们可以得到另一个值。

例如,从那个问题:

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000; 
    System.out.println(ld4-ld3);
}

353的时区输出为Shanghai,而其他时区的输出为1

我的问题是,如何计算没有时区的差异?如何始终获得正确的差异?

3 个答案:

答案 0 :(得分:1)

您可以使用Joda Time轻松处理时区。

以下是如何直接或通过从timezoneful DateTime实例转换来构造无时区的LocalDateTime。

LocalDateTime a1 = new LocalDateTime(1927, 12, 31, 0, 0, 0, 0);
LocalDateTime a2 = new LocalDateTime(1928, 1, 2, 0, 0, 0, 0);
System.out.println(a1);
System.out.println(a2);
System.out.println(Seconds.secondsBetween(a1, a2).getSeconds()); // 172800 == 60 * 60 * 24 * 2 == 2 days without leap seconds

DateTime b1 = new DateTime(1927, 12, 31, 0, 0, 0, 0, DateTimeZone.forID("Asia/Shanghai"));
DateTime b2 = new DateTime(1928, 1, 2, 0, 0, 0, 0, DateTimeZone.forID("Asia/Shanghai"));
System.out.println(b1);
System.out.println(b2);
System.out.println(Seconds.secondsBetween(b1, b2).getSeconds());

LocalDateTime c1 = b1.toLocalDateTime();
LocalDateTime c2 = b2.toLocalDateTime();
System.out.println(c1);
System.out.println(c2);
System.out.println(Seconds.secondsBetween(c1, c2).getSeconds());

这将打印如下。请注意上午its timezone adjustment in 1927之前的有趣时区。

1927-12-31T00:00:00.000
1928-01-02T00:00:00.000
172800
1927-12-31T00:00:00.000+08:05:52
1928-01-02T00:00:00.000+08:00
173152
1927-12-31T00:00:00.000
1928-01-02T00:00:00.000
172800

答案 1 :(得分:1)

在上海,此时的时区从LMT变为CST。

  

1928年1月1日星期日00:00:00时钟0:05:52时向后转   1927年12月31日星期六,当地标准时间23:54:08

http://www.timeanddate.com/worldclock/clockchange.html?n=237&year=1927

答案 2 :(得分:-1)

而不是长期转换每个date代码:

long i = (sDt4.getTime() - sDt3.getTime()) / (1000);
System.out.println(i);

输出是:

1
相关问题