从日期开始的本地时间

LocalTime from Date

我正在尝试将 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。

您的输入实际上是 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);
    }
}

试试这个

    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();

这也很简单:

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

是正确的。这个答案扩展了这些想法。

避免遗留日期时间类

其他一些答案和问题,将旧的遗留日期时间 类 与新的混合在一起。这是不必要的和不好的做法。 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

请注意,其中 none 是实际时刻,而不是时间轴上的一个点。如果没有与 UTC 的偏移量或时区的上下文,我们不知道您是指新西兰奥克兰的凌晨 5 点或印度加尔各答的凌晨 5 点,还是法国巴黎的凌晨 5 点或魁北克蒙特利尔的凌晨 5 点。每一个都是非常不同的时刻。

如果根据上下文您确实知道预期的时区,请应用它。应用 ZoneId to get a ZonedDateTime.

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

如果需要,请从那里索要 LocalTime

LocalTime lt = zdt.toLocalTime(); 

Instant

如果您想在 UTC, extract an Instant. The Instant class represents a moment on the timeline in UTC with a resolution of nanoseconds 中看到相同的时刻(最多九 (9) 位小数)。

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

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