我需要用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);
现在这会产生异常。
答案 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)
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);