java.sql.Timestamp ZoneOffset与java.time不匹配

时间:2015-10-19 02:15:27

标签: java timestamp java-8 java-time timestamp-with-timezone

Instant inst = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC); - > 2015-10-19T00:00:00Z

Timestamp.from(inst) - > 2015-10-19 11:00:00.0

为什么java.sql.Timestamp在转换后添加我的本地时区(+11)?

1 个答案:

答案 0 :(得分:2)

好的,如果我们拿你的代码......

Instant inst = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC);
Timestamp ts = Timestamp.from(inst);

System.out.println(inst);
System.out.println(ts);

打印......

2015-10-19T00:00:00Z
2015-10-19 11:00:00.0

这可能是意料之外的,但如果我们添加......

System.out.println(inst.toEpochMilli());
System.out.println(ts.getTime());

输出

1445212800000
1445212800000

您可以看到这两个值实际上是相同的,但Timestamp在打印时应用了本地时区

现在,如果相反,我们会做类似的事情......

Instant inst = LocalDate.now().atStartOfDay(ZoneId.systemDefault()).toInstant();
Timestamp ts = Timestamp.from(inst);

System.out.println(inst);
System.out.println(ts);
System.out.println(inst.toEpochMilli());
System.out.println(ts.getTime());

使用系统的时区,打印

2015-10-18T13:00:00Z
2015-10-19 00:00:00.0
1445173200000
1445173200000

那么,问题就变成了,哪一个对你更重要?就个人而言,我认为你所拥有的更重要