首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LocalTime从日期开始

LocalTime从日期开始
EN

Stack Overflow用户
提问于 2015-04-28 18:40:05
回答 4查看 40.1K关注 0票数 16

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

代码语言:javascript
复制
// 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。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-04-28 18:49:24

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

代码语言:javascript
复制
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);
    }
}
票数 12
EN

Stack Overflow用户

发布于 2016-10-05 09:14:51

这也很简单:

代码语言:javascript
复制
LocalTime time = LocalDateTime.ofInstant(new Date().toInstant(),
    ZoneId.systemDefault()).toLocalTime();
票数 22
EN

Stack Overflow用户

发布于 2016-10-05 22:47:23

乔恩·斯基特接受答复是正确的。这个答案扩展到了这些想法上。

避免遗留日期-时间类

其他一些答案,以及问题,将旧的遗留日期-时间类与新的类混合在一起。这是不必要的,也是错误的做法。java.time类的全部目的是替换那些麻烦和混乱的旧类。

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

LocalDateTime

您的输入字符串缺少有关偏移量-UTC或时区的任何信息。所以我们把它解析为一个LocalDateTime对象。

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

代码语言:javascript
复制
String input = "2011-02-18 05:00:00.0".replace( " " , "T" );
LocalDateTime ldt = LocalDateTime.parse( input );

LocalTime

要专注于一天中没有日期的时间,就要求一个LocalTime

代码语言:javascript
复制
LocalTime lt = ldt.toLocalTime();

ZonedDateTime

请注意,所有这些都不是实际的时刻,不是时间线上的一个点。如果没有世界协调时或时区的抵消,我们不知道你指的是新西兰奥克兰的早上5点,加尔各答的5点,法国的巴黎5点,或魁北克蒙特勒亚州的5点。每一个时刻都将是非常不同的时刻。

如果您确实知道特定的预期时区,请应用它。应用ZoneId来获得ZonedDateTime

代码语言:javascript
复制
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( z );

从那里开始,如果需要的话,请请求LocalTime

代码语言:javascript
复制
LocalTime lt = zdt.toLocalTime(); 

Instant

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

通常最好在大部分业务逻辑、日志记录、数据存储和数据交换中关注UTC。学会把UTC看作是“一个真正的时间”。

代码语言:javascript
复制
Instant instant = zdt.toInstant();  // Same moment, shifted to UTC.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29927362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档