来自Date的LocalTime

时间:2015-04-28 18:40:05

标签: java date localtime

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

4 个答案:

答案 0 :(得分:11)

这也很简单: LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).toLocalTime()

答案 1 :(得分:10)

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

答案 2 :(得分:3)

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

避免遗留日期时间类

其他一些答案和问题,将旧的旧日期时间类与新的混合。这是不必要的和不好的做法。 java.time类的重点是替换麻烦和混乱的旧类。

  • 需要java.util.Date
  • 需要java.util.Calendar

LocalDateTime

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

要进行解析,我们会使用T替换中间的SPACE,以符合日期时间格式的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.

答案 3 :(得分:0)

试试这个

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