【问题标题】:java.sql.Timestamp ZoneOffset mismatch with java.timejava.sql.Timestamp ZoneOffset 与 java.time 不匹配
【发布时间】:2015-10-19 02:15:26
【问题描述】:

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)?

【问题讨论】:

  • 我认为这是关于时区的。您与 UTC 的本地偏移量是多少?
  • 如果你同时转储instTimestamp 毫秒值,两者是相同的,1445212800000,很可能Timestamp 是在本地时区显示值跨度>
  • 嗨,我的本地时区是 +11,但我需要知道如何正确获取 java.sql.Timestamp of LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)
  • "嗨,我的本地时区是 +11,但我需要知道如何正确获取 java.sql.Timestamp 的 LocalDate.now().atStartOfDay().toInstant(ZoneOffset .UTC) " - 你已经有了

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


【解决方案1】:

好的,如果我们获取您的代码...

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

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

【讨论】:

  • 好的...所以这是字符串转换的问题,是什么导致我进入下一个问题...谢谢@madprogrammer
猜你喜欢
  • 2018-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
相关资源
最近更新 更多