【问题标题】:LocalTime from Date从日期开始的本地时间
【发布时间】:2015-07-07 18:32:34
【问题描述】:

我正在尝试将 Date 实例转换为 LocalTime 实例。

// Create the Date
Date date = format.parse("2011-02-18 05:00:00.0");    

// Convert to Calendar
Calendar cal = Calendar.getInstance();
cal.setTime(date);

// Convert Calendar to LocalTime
Instant instant = Instant.ofEpochMilli(cal.getTimeInMillis());
LocalTime convert = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();

我没有收到编译器错误,但 LocalTime 实例值错误。

我认为它不起作用,因为Date 将时间存储在fasttime 而不是cdate

我使用的是 JDK 1.8 版。

【问题讨论】:

  • 先是先,我们说的是什么版本的Java?
  • @RafaelR.S.Robles JDK 1.8

标签: java date localtime


【解决方案1】:

这也很简单:

LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(),
    ZoneId.systemDefault()).toLocalTime();

【讨论】:

  • 可以用 LocalTime.ofInstant() 来简化
【解决方案2】:

您的输入实际上是LocalDateTime。简单地将其解析为 LocalDateTime 然后从中获取 LocalTime 会简单得多。无需担心时区,无需某些遗留类(尽可能避免使用DateCalendar...)

import java.time.*;
import java.time.format.*;
import java.util.*;

public class Test {

    public static void main(String[] args) {
        DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S", Locale.US);

        String text = "2011-02-18 05:00:00.0";
        LocalDateTime localDateTime = LocalDateTime.parse(text, formatter);
        LocalTime localTime = localDateTime.toLocalTime();
        System.out.println(localTime);
    }
}

【讨论】:

    【解决方案3】:

    accepted Answer by Jon Skeet 是正确的。这个答案扩展了这些想法。

    避免使用旧的日期时间类

    其他一些答案和问题将旧的旧日期时间类与新的混合在一起。这是不必要和不好的做法。 java.time 类的全部意义在于替换麻烦且令人困惑的旧类。

    • 你确实不需要需要java.util.Date
    • 你确实不需要需要java.util.Calendar

    LocalDateTime

    您的输入字符串缺少有关从 UTC 偏移或时区的任何信息。所以我们将其解析为LocalDateTime 对象。

    为了解析,我们将中间的 SPACE 替换为 T 以符合日期时间格式的 ISO 8601 标准。

    String input = "2011-02-18 05:00:00.0".replace( " " , "T" );
    LocalDateTime ldt = LocalDateTime.parse( input );
    

    LocalTime

    要关注没有日期的时间,请联系LocalTime

    LocalTime lt = ldt.toLocalTime();
    

    ZonedDateTime

    请注意,这些都不是真实的时刻,也不是时间线上的一个点。如果没有从 UTC 偏移或时区的上下文,我们不知道您是指新西兰奥克兰的凌晨 5 点还是加尔各答 IN 的凌晨 5 点,法国巴黎的凌晨 5 点或魁北克蒙特利尔的凌晨 5 点。每一个都是非常不同的时刻。

    如果根据上下文您确实知道预期的时区,请应用它。申请ZoneId 以获得ZonedDateTime

    ZoneId z = ZoneId.of( "America/Montreal" );
    ZonedDateTime zdt = ldt.atZone( z );
    

    如果需要,从那里询问LocalTime

    LocalTime lt = zdt.toLocalTime(); 
    

    Instant

    如果您想在UTC 中看到同一时刻,请提取InstantInstant 类表示 UTC 时间线上的时刻,分辨率为 nanoseconds(最多九 (9) 位小数)。

    通常最好在您的大部分业务逻辑、日志记录、数据存储和数据交换中关注UTC。学会将 UTC 视为“真正的时间”。

    Instant instant = zdt.toInstant();  // Same moment, shifted to UTC.
    

    【讨论】:

      【解决方案4】:

      试试这个

          String datestring = "2011-02-18 05:00:00.0";
          SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");//take a look at MM
          Date date = dt.parse(datestring );
          Instant instant = Instant.ofEpochMilli(date.getTime());
          LocalTime res = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()).toLocalTime();
      

      【讨论】:

      • 愚蠢地将麻烦的旧类与 java.time 类混合在一起。旧的类现在被 java.time 类所取代。不需要旧的。
      • 如果你必须使用旧类和新类,你会怎么做?重构任何代码库以适应新类?这是没有意义的。有时需要同时使用旧样式和新样式,这适用于任何开发工作,而不仅仅是 Java。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      相关资源
      最近更新 更多