【问题标题】:Convert LocalTime (Java 8) to Date将 LocalTime (Java 8) 转换为日期
【发布时间】:2016-01-10 23:08:03
【问题描述】:

我正在尝试将java.time.LocalTime 对象转换为java.util.Date,但找不到任何合适的方法。这样做的正确方法是什么?

java 似乎没有内置的直接转换方法有什么原因吗?

对于可能的重复:
How to convert joda time - 不适合我,可能我缺少一些“joda”库?
How to convert Date to LocalTime? - 这解决了转换问题。

【问题讨论】:

标签: java date java-8 java-time


【解决方案1】:

LocalTime 实际上不能转换为 Date,因为它只包含 DateTime 的 time 部分。比如11:00。但没有一天是已知的。您必须手动提供:

LocalTime lt = ...;
Instant instant = lt.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
        atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);

这是一篇博文,explains all the conversions 介于新旧 API 之间。

没有简单的内置转换方法,因为这些 API 以完全不同的方式处理日期和时间的概念。

【讨论】:

  • 谢谢!但是我对您的 LocalTime 声明感到困惑。 LocalTime lt = ... 到底是什么意思?
  • 这意味着您应该手动创建对象或从某个地方获取它。这不是 Java,如果这就是你要问的。
  • Dariusz 的意思是你必须提供四样东西才能使用他的代码:一个 LocalTime 对象、一个表示年份的整数、一个表示月份的整数和一个表示日期的整数。此外,将 ZoneId.systemDefault 替换为特定的 ZoneId,具体取决于您打算在哪里使用此日期时间。例如,12 月 3 日的 12:30 在巴黎比蒙特利尔早。
【解决方案2】:
LocalTime lt = ...;
Instant instant = lt.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
        atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);

来自: http://blog.progs.be/542/date-to-java-time

【讨论】:

    【解决方案3】:

    我将数据(小时、分钟、秒)一一添加(从本地时间到日期):

    reta.setHours(vol.getRetard().getHour());
    reta.setMinutes(vol.getRetard().getMinute());
    reta.setSeconds(vol.getRetard().getSecond());
    

    注意: reta:日期可验证; vol.getRetard():本地时间变量

    【讨论】:

      【解决方案4】:

      正如其他人所说,这是一个有问题的问题,因为 LocalTimeDate 确实代表了完全不同且几乎不相关的概念。 LocalTime 是一天中没有时区的时间,例如 19:45(或 7:45 PM)。 Date 是时间线上的一个点;如果它恰好在某个时区的某个日期与 19:45 重合,则不会在其他时区。

      我认为,在一天中的一个小时内滥用(实际上)Date 的传统方式是将其设置为 JVM 的默认时区中 1970 年 1 月 1 日的那个时间。这种做法承担了已经提到的所有责任。特别是 JVM 默认时区设置可以随时从程序的另一部分或在同一 JVM 中运行的任何其他程序更改。这意味着一个完全不相关的程序可能会突然导致您的 Date 指示一天中的不同时间,而不是您初始化它的时间。

      没有什么比这更好的了,所以就这样吧:

          LocalTime time = LocalTime.of(11, 0);
      
          Instant timeOnEpochDayInDefaultTimeZone = LocalDate.EPOCH
                  .atTime(time)
                  .atZone(ZoneId.systemDefault())
                  .toInstant();
          Date oldfashionedDateObject = Date.from(timeOnEpochDayInDefaultTimeZone);
      
          System.out.println(oldfashionedDateObject);
      

      在我的时区,这个 sn-p 的输出是:

      1970 年 1 月 1 日星期四 11:00:00 CET

      【讨论】:

        【解决方案5】:

        这是另一种方法:

        我们可以将 LocalDate 添加到 LocalTime 以使其成为 LocalDateTime,然后使用 java.sql.Timestamp 的 valueOf 方法将其转换为 Date,如下所示:

        LocalTime localTime = LocalTime.now();
        Date date = java.sql.Timestamp.valueOf(localTime.atDate(LocalDate.now()));
        

        【讨论】:

        • 不推荐。来自the documentation:“建议代码不要将Timestamp 值一般视为java.util.Date 的实例。”
        猜你喜欢
        • 1970-01-01
        • 2020-09-24
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多