Java 8 DateTimeFormatter



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

现在这正在生成异常。

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

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

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

如果只在Date中插入,请使用LocalDate而不是LocalDateTime

tl;dr

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

一种方法是-

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

相关内容

  • 没有找到相关文章

最新更新