我正在尝试将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版。
答案 0 :(得分:11)
这也很简单:
LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault()).toLocalTime()
答案 1 :(得分:10)
您的输入实际上是LocalDateTime
。简单地将其解析为LocalDateTime
然后从中获取LocalTime
会简单得多。没有时区可以担心,没有一些遗留类别(尽可能避免Date
和Calendar
...)
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中看到同一时刻,请提取Instant
。 Instant
类代表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();