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