Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将java.sql.timestamp转换为LocalDate(java8)java.time?_Java_Timestamp_Java 8_Localtime_Java Time - Fatal编程技术网

如何将java.sql.timestamp转换为LocalDate(java8)java.time?

如何将java.sql.timestamp转换为LocalDate(java8)java.time?,java,timestamp,java-8,localtime,java-time,Java,Timestamp,Java 8,Localtime,Java Time,在Java 8中,如何将时间戳(在Java.sql中)转换为LocalDate(在Java.time中)?您可以执行以下操作: timeStamp.toLocalDateTime().toLocalDate(); 请注意,timestamp.toLocalDateTime()将使用Clock.systemDefaultZone()时区进行转换。这可能是您想要的,也可能不是您想要的 我将稍微扩展@assylias answer以考虑时区。至少有两种方法可以获取特定时区的LocalDateTime

在Java 8中,如何将
时间戳
(在
Java.sql
中)转换为
LocalDate
(在
Java.time
中)?

您可以执行以下操作:

timeStamp.toLocalDateTime().toLocalDate();
请注意,
timestamp.toLocalDateTime()
将使用
Clock.systemDefaultZone()
时区进行转换。
这可能是您想要的,也可能不是您想要的


我将稍微扩展@assylias answer以考虑时区。至少有两种方法可以获取特定时区的LocalDateTime

您可以对整个应用程序使用setDefault时区。应在任何时间戳->java.time转换之前调用它:

public static void main(String... args) {
    TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
    TimeZone.setDefault(utcTimeZone);
    ...
    timestamp.toLocalDateTime().toLocalDate();
}
或者您可以使用toInstant.atZone链:

timestamp.toInstant()
        .atZone(ZoneId.of("UTC"))
        .toLocalDate();

被接受的答案并不理想,所以我决定加上2美分

timeStamp.toLocalDateTime().toLocalDate();
通常是一个糟糕的解决方案,我甚至不知道他们为什么要将此方法添加到JDK中,因为使用系统时区进行隐式转换会让事情变得非常混乱。通常,当只使用java8日期类时,程序员被迫指定一个时区,这是一件好事

好的解决方案是

timestamp.toInstant().atZone(zoneId).toLocalDate()
其中,zoneId是您想要使用的时区,如果您想要使用系统时区或一些硬编码时区,如ZoneOffset.UTC

一般做法应该是:

  • 使用一个直接相关的类,例如在我们的例子中,java.time.Instant与java.sql.Timestamp直接相关,即它们之间不需要时区转换
  • 使用这个java8类中设计良好的方法来做正确的事情。在我们的例子中,atZone(zoneId)明确表示我们正在进行转换并使用特定的时区

  • Java 8中添加了它。请注意,
    timestamp.toLocalDateTime()
    方法将使用系统默认时区进行转换。这可能是您想要的,也可能不是您想要的。@jacobhyblenated请使用显式时区发布答案。谢谢@jacobhyphenated的评论在这里非常重要,因此获得了更多的支持票。有关详细信息,请参见我的答案@jacobhyphenated,
    LocalDateTime
    始终使用系统默认时区。这就是“本地”在其名称中的含义。我在这里有一个类似的问题:。简短的回答,不是真的。但这不一定是坏事,我不同意。时间戳(以及日期)没有任何区域信息。LocalDate没有任何区域信息,因此两者是等效的。它们之间的转换可以独立于任何特定区域进行。在转换为LocalDate之前,先转换为ZoneDateTime会增加一个时区,然后再将其取消-这样做很可能会出现一个令人讨厌的、难以发现的错误。@AutomatedMike时间戳(以及日期)表示UTC中的一个时间点。LocalDate并不代表时间点,而是一个在挂钟上看到的时间。请阅读他们的javadocs。“它们之间的转换可以独立于任何特定区域进行”-不正确,新的时间戳(0L)。toLocalDateTime()为我的莫斯科时区返回“1970-01-01T03:00”。对于您的时区,结果可能不同。@AutomatedMike即使您通过执行toLocalDate()来剥离时间,也很容易证明,如果时间戳的时间在午夜左右,例如新的时间戳(1000*60*60*23)。toLocalDateTime()。toLocalDate()在我的莫斯科时区为“1970-01-01”时返回“1970-01-02”在UTC中。@AutomatedMike“添加一个时区,然后再将其删除”-重点不是添加和删除一个时区,而是通过使用显式时区在不同概念之间转换。这与我前面两个注释中隐式应用时区的示例形成对比。