在问题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
。
我的问题是,如何计算没有时区的差异?如何始终获得正确的差异?
答案 0 :(得分:1)
您可以使用Joda Time轻松处理时区。
您可以使用所需时区创建DateTimeFormatter并使用它来解析字符串。 DateTime实例也可以是converted to other time zones。
您可以使用LocalDateTime类完全忽略时区。
此外,Period类还有toStandardSeconds(),toStandardDuration(),normalizedStandard()等方法,这些方法“假设所有星期都是7天,所有日子是24小时,所有小时都是60分钟,所有时间都是60秒。考虑到夏令时时不是这样,对于某些不寻常的年表也可能不是这样。但是,它包括在内,因为它是一个有用的操作许多应用程序和业务规则。“
以下是如何直接或通过从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)