【问题标题】:How do I make java.sql.Timestamp UTC time? [duplicate]如何使 java.sql.Timestamp UTC 时间? [复制]
【发布时间】:2017-10-05 20:19:15
【问题描述】:
public static void main(String[] args) {

    LocalDateTime ldt = LocalDateTime.now();

    ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());

    Instant instant = Instant.from(zdt);

    Timestamp timestamp = Timestamp.from(instant);

    System.out.println(ldt + "\n");

    System.out.println(zdt + "\n");

    System.out.println(instant + "\n");

    System.out.println(timestamp + "\n");
}

然后打印出来:

2017-05-07T18:13:26.969

2017-05-07T18:13:26.969-04:00[America/New_York]

2017-05-07T22:13:26.969Z

2017-05-07 18:13:26.969

如何使 SQL TimestampInstant 在同一时间保存?我需要能够从任何地方获取Timestamp 并将其转换为它碰巧在世界那个地方的任何时间。问题是它一直保存与我的系统时钟设置的时间相同。

【问题讨论】:

  • 这在使用不存储时区的 oracle DATE 列时为我完成了这项工作。 Timestamp.valueOf(ZonedDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneOffset.UTC).toLocalDateTime())

标签: java sql jdbc timestamp


【解决方案1】:

您最好从LocalDateTime 获得Timestamp,而不是从Instant

第一步是获取您的ZonedDateTime 并将其转换为格林威治标准时间:

ZonedDateTime gmt = zdt.withZoneSameInstant(ZoneId.of("GMT"));

然后您可以通过LocalDateTime 将其转换为Timestamp

Timestamp timestamp = Timestamp.valueOf(gmt.toLocalDateTime());

【讨论】:

  • 这有帮助。 Instant 完全是骗人的,因为它会打印当前的 UTC 时间,但是当转换为 Timestamp 时,会显示我的当地时间。因此,当它保存到远程数据库时,它将是我所在的任何时间。我知道Timestamp 没有时区,Instant 是一个纪元的偏移量,但如果Timestamp 将当前时间记录为当地时间而不是当前的 UTC 时间,那它完全没用。这是一个很难提出的问题,因为每个人都自动假设我认为它应该显示时区。
  • 这似乎也帮助我解决了时间戳本地时间转换问题。我不知道这是否过度转换,但以下链转换了一个存储在 UTC 中的 long 并通过 LDT 而不是从 Instant 将其转换为时间戳:Timestamp.valueOf( LocalDateTime.ofEpochSecond(longEpochVal, 0, ZoneOffset.UTC))
  • 这里可能值得注意的是 Timestamp 本身与时区无关..?例如,如果您打印出 Timestamp 的 fastTime,您将获得 UTC 毫秒数,但如果您使用 .toString,则将其转换为 UTC+X 的 toString 方法... Instant.toString() 返回 UTC 时区的时间。另一方面, Timezone.toString() 返回本地机器时区的时间。见这里:baeldung.com/java-time-instant-to-java-sql-timestamp
  • LocaleDateTime 丢弃特定于该区域的任何信息。它将始终返回本地区域的值。 zdt 将具有本地值,而不是 GMT。因此,为转换添加任何区域偏移不会产生任何变化。我试过这样做。
【解决方案2】:

如果您想表示“TIMESTAMP WITH TIME ZONE”值,您可能需要使用带有日历对象的 setTimestamp 的特定重载。

【讨论】:

    猜你喜欢
    • 2016-06-19
    • 2017-07-04
    • 2014-05-08
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2016-06-12
    • 1970-01-01
    相关资源
    最近更新 更多