Instant inst = LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC);-> 2015-10-19T00:00:00ZTimestamp.from(inst)-> 2015-10-19 11:00:00.0
为什么java.sql.Timestamp在转换后会添加我的本地时区(+11)?

最佳答案

好吧,如果我们接受您的代码...

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

因此,问题就变成了,哪个对您更重要?就个人而言,我认为您拥有的更重要

10-08 19:27