【发布时间】:2015-11-08 14:15:45
【问题描述】:
我开发了一个 SonarQube 插件,出于我的一个需求,我需要将项目的分析日期存储为 SQL TIMESTAMP(请注意: TIMESTAMP 和 不是TIMESTAMP WITH TIMEZONE)。
这是我目前的做法:
// In the SonarQube Sensor
// .getAnalysisDate() returns a java.util.Date
final Instant instant = module.getAnalysisDate().toInstant();
// Timestamp at UTC from the Instant
final LocalDateTime dt = LocalDateTime.frominstant(instant, ZoneOffset.UTC);
final Timestampt ts = Timestamp.valueOf(dt);
我在理解 Instant 的概念时有点困难,还有 ZonedDateTime 等......
无论如何,这似乎是我想要的,但它是正确的方式吗?
【问题讨论】:
-
假设您的分析日期是 2015 年 11 月 8 日星期日晚上 7 点 UTC,您计算机的本地时区是 CET(冬季时间为 UTC+1),即晚上 8 点。您想在数据库中的
TIMESTAMP中存储什么?晚上七点还是八点?从您的代码的外观来看,您想要晚上 8 点 - 但是除非检索数据的机器位于同一时区 (CET),否则您将无法获得相同的即时返回...也许您应该提供更多背景信息... (ps:使用没有时区的时间戳通常是个坏主意,除非您始终为该列使用相同的 TZ,通常是 UTC)。 -
@assylias 从我的代码看来,相反,给定您的代码,结果将是晚上 7 点——这正是所要求的。是的,我知道这是个坏主意,但这是我被要求的……如果只是为了我,我会存储一个
TIMESTAMP WITH TIME ZONE而不是纯粹的TIMESTAMP。