Java-多种方案的日期格式

时间:2019-05-08 16:33:44

标签: java datetime formatting

我有一个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";

现在,如果我没有通过短信,它将失败。谢谢!

2 个答案:

答案 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 zoneoffset-from-UTC的上下文,LocalDateTime无法保持片刻。

请暂时使用ZonedDateTimeOffsetDateTimeInstant类。教您的数据发布者包括偏移量,最好使用UTC。

enter image description here

避免使用旧的日期时间类

旧的类SimpleDateFormatDateCalendar糟糕透顶,糟糕的设计选择由不熟悉日期时间处理的人员编写。几年前,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