我有一个Java组件来格式化检索的日期。这是我的代码:
Format formatter = new SimpleDateFormat("yyyyMMdd");
String s = "2019-04-23 06:57:00.0";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss.S");
try
{
Date date = simpleDateFormat.parse(s);
System.out.println("Formatter: "+formatter.format(date));
}
catch (ParseException ex)
{
System.out.println("Exception "+ex);
}
只要String的格式为"2019-04-23 06:57:00.0";
我的问题是,如何调整此代码,使其适用于以下场景,例如,
我的s
字符串可能具有
String s = "2019-04-23 06:57:00.0";
or
String s = "2019-04-23 06:57:00";
Or
String s = "2019-04-23";
现在,如果我没有通过短信,它将失败。谢谢!
答案 0 :(得分:4)
String s = "2019-04-23 06:57:00";
String s = "2019-04-23";
这是两种不同的信息。一个是带有日期的日期,另一个是简单的日期。因此,您应该将每个对象解析为不同类型的对象。
LocalDateTime.parse
要遵守LocalDateTime
类中默认使用的ISO 8601标准格式,请将中间的SPACE替换为T
。我建议您在将日期时间值转换为文本时,教育数据发布者仅使用ISO 8601格式。
LocalDateTime ldt1 = LocalDateTime.parse( "2019-04-23 06:57:00".replace( " " , "T" ) ) ;
默认情况下,小数秒也将解析。
LocalDateTime ldt2 = LocalDateTime.parse( "2019-04-23 06:57:00.0".replace( " " , "T" ) ) ;
请参阅此code run live at IdeOne.com。
ldt1.toString():2019-04-23T06:57
ldt2.toString():2019-04-23T06:57
LocalDate.parse
您的仅日期输入已经符合ISO 8601。
LocalDate ld = LocalDate.parse( "2019-04-23" ) ;
请参阅此code run live at IdeOne.com。
ld.toString():2019-04-23
您可以从日期中删除一天中的时间。
LocalDate ld = ldt.toLocalDate() ;
您可以将其重新添加。
LocalTime lt = LocalTime.parse( "06:57:00" ) ;
LocalDateTime ldt = ld.with( lt ) ;
但是,请注意,LocalDateTime
不会不是代表时刻,是 not 在时间轴上的一点。如其类JavaDoc中所述,缺少time zone或offset-from-UTC的上下文,LocalDateTime
无法保持片刻。
请暂时使用ZonedDateTime
,OffsetDateTime
或Instant
类。教您的数据发布者包括偏移量,最好使用UTC。
旧的类SimpleDateFormat
,Date
和Calendar
糟糕透顶,糟糕的设计选择由不熟悉日期时间处理的人员编写。几年前,JSR 310中定义的现代 java.time 类取代了这些类。
答案 1 :(得分:1)
如果图案中有可选部件,则可以使用[
和]
。
例如
public static Instant toInstant(final String timeStr){
final DateTimeFormatter formatter = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH[:mm[:ss[ SSSSSSSS]]]")
.withZone(ZoneId.of("UTC"));
try {
return Instant.from(formatter.parse(timeStr));
}catch (DateTimeException e){
final DateTimeFormatter formatter2 = DateTimeFormatter
.ofPattern("yyyy-MM-dd")
.withZone(ZoneId.of("UTC"));
return LocalDate.parse(timeStr, formatter2).atStartOfDay().atZone(ZoneId.of("UTC")).toInstant();
}
}
封面
yyyy-MM-dd
yyyy-MM-dd HH
yyyy-MM-dd HH:mm
yyyy-MM-dd HH:mm:ss
yyyy-MM-dd HH:mm:ss SSSSSSSS