0

我需要用 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

4 回答 4

4
   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

于 2017-02-11T12:59:36.253 回答
2

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相当于旧的 legacy类java.util.Date。两者都代表 UTC 时间线上的一个时刻。现代类具有更精细的分辨率,纳秒而不是毫秒。

避免java.util.Date

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

java.util.Date d = java.util.Date.from( instant ) ; 
于 2017-02-11T18:05:38.857 回答
2

如果在 DateTimeFormatter 中寻找等效的 sdf,请尝试DateTimeFormatter.ISO_LOCAL_DATE
探索DateTimeFormatter该类以获取更多格式。

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

如果仅对日期感兴趣,则使用LocalDate而不是。LocalDateTime

于 2017-02-11T12:46:13.847 回答
1

一种方法是-

    LocalDateTime ld = LocalDateTime.now();
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    String date = ld.format(dtf);
于 2017-02-11T12:52:37.147 回答