简而言之:
我有一个纪元,我想把它定为时间,因为January 1, 1970, 00:00:00 GMT
和java.util.Date
一样会给定。
此代码有助于演示我的问题:
import java.util.Date;
import java.util.Locale;
import org.junit.Test;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class TimeHelp {
private String format = "EEE MMM dd HH:mm:ss yyyy";
public SimpleDateFormat asSimpleDateFormat() {
return new SimpleDateFormat(format, Locale.ENGLISH);
}
public DateTimeFormatter asDateTimeFormatter() {
return DateTimeFormatter.ofPattern(format, Locale.ENGLISH);
}
@Test
public void test() throws Exception {
System.out.println(ZoneId.systemDefault());
String s = "Sun Apr 04 02:00:01 2010";
long t1 = asSimpleDateFormat().parse(s).getTime();
ZonedDateTime zoned = LocalDateTime.parse(s, asDateTimeFormatter())
.atZone(ZoneId.systemDefault());
long t2 = zoned.toEpochSecond() * 1000;
long t3 = Date.from(zoned.toInstant()).getTime();
long t4 = zoned.toInstant().toEpochMilli();
System.out.println("t1 " + t1);
System.out.println("t2 " + t2);
System.out.println("t3 " + t3);
System.out.println("t4 " + t4);
System.out.println("Difference in minutes " + Math.abs(t1 - t2)/1000/60);
}
}
然后输出:
Australia/Sydney
t1 1270310401000
t2 1270306801000
t3 1270306801000
t4 1270306801000
Difference in minutes 60
请注意,t1与所有其他都不相同,我认为是因为t1是格林尼治标准时间,而其他都是UTC。
如果使用SimpleDateFormat
,则long的值与如果使用DateTimeFormatter
获得ZonedDateTime
,然后调用toEpochSecond()
的值不同。
出于某些原因,我想获得一个ZonedDateTime
,但我想将其转换为Date
,但由于Date
在GMT而不是UTC
中起作用,所以看起来这样的事情不起作用。
当当地夏令时即将到达
Sunday, April 4, 2010, 3:00:00 am
时,时钟会向后调1小时至Sunday, April 4, 2010, 2:00:00 am
当地标准时间。
这意味着Sun Apr 04 02:00:01 2010
在当天发生[[两次。那么,您会从那2个中得到哪一个?
SimpleDateFormat
,您会得到稍后,尽管未记录。
使用ZonedDateTime
,您将获得早期
:对于重叠,通常的策略是,如果本地日期时间落在重叠的中间,则将保留以前的偏移量。如果没有先前的偏移量,或者先前的偏移量无效,则使用较早的偏移量,通常为“夏令时”。ZonedDateTime
和withEarlierOffsetAtOverlap()
这两种其他方法可帮助管理重叠情况。