Java 8 DateTimeFormatter

时间:2017-02-11 12:31:42

标签: java java-8

我需要用Java 8 DateTimeFormatter替换SimpleDataFormat。下面是使用SimpleDateFormat的代码。

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = sdf.parse(source);

现在我需要将其更改为DateTimeFormatter。我试过如下

LocalDateTime ld = LocalDateTime.now();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
Date startdate = dtf.parse(dtf);

现在这会产生异常。

4 个答案:

答案 0 :(得分:3)

   DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
   LocalDate localDate = LocalDate.parse("2017-02-11", dtf);
   System.out.println(localDate.toString());

如果您想要LocalDate中的Date对象,则以下工作

Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());

正如@JonSkeet建议的那样,如果你正在使用Java 8,你应该完全避免 java.util.Date

答案 1 :(得分:1)

如果在DateTimeFormatter中查找等效的sdf,请尝试DateTimeFormatter.ISO_LOCAL_DATE
了解更多格式的DateTimeFormatter课程。

 LocalDateTime time = LocalDateTime.now();
    time.format(DateTimeFormatter.ISO_LOCAL_DATE);

如果仅在日期中感兴趣,请使用LocalDate代替LocalDateTime

答案 2 :(得分:1)

TL;博士

java.util.Date.from(

LocalDate.parse( "2017-01-23" )
         .atStartOfDay( ZoneId.of( "America/Montreal" ) )
         .toInstant()

)

无需格式化模式

不需要格式化模式。您的输入字符串恰好是标准的ISO 8601格式。默认情况下,这些标准格式在java.time类中用于解析和生成字符串。

LocalDate

使用LocalDate获取仅限日期的值,不包含时间和没有时区。

LocalDate ld = LocalDate.parse( "2017-01-23" );

ZonedDateTime

如果你想要一个日期时间,让java.time确定一天的第一时刻。不要以为第一时刻是00:00:00

确定当天的第一时刻需要一个时区。地区的日期因地区而异。

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ld.atStartOfDay( z );

如果您想通过UTC镜头感知那一刻,请提取Instant个对象。

Instant instant = zdt.toInstant();

Instant相当于旧的遗留类java.util.Date。两者都代表UTC时间轴上的一个时刻。现代类具有更精细的分辨率,纳秒而不是毫秒。

避免java.util.Date

正如其他人提到的,你应该坚持使用现代java.time类。但如果你必须,你可以转换。查看添加到旧类的新方法。

java.util.Date d = java.util.Date.from( instant ) ; 

答案 3 :(得分:0)

这样做的一种方法是 -

    LocalDateTime ld = LocalDateTime.now();
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    String date = ld.format(dtf);