将ISO 8601日期转换为标准字符串格式

Jam*_*ven 2 java iso8601 jodatime

我正在尝试将有效的ISO 8601字符串转换为一致的格式,以便可以使用简单的字典顺序进行排序和搜索.

我的应用程序可以使用以下任何格式接收日期/时间,例如:

2015-02-05T02:05:17.000+00:00
2015-02-05T02:05:17+00:00
2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)

这些都代表相同的日期/时间,我想将它们全部转换为规范的存储形式,例如:

2015-02-05T02:05:17.000Z
Run Code Online (Sandbox Code Playgroud)

我的第一个想法是使用从将ISO 8601兼容的String转换为java.util.Date的技术解析它们,然后转换回所需的字符串,但在处理不太精确的日期/时间时会出现故障,例如:

2015-02-05T02:05:17Z
2015-02-05T02:05Z
2015-02-05Z
2015-02Z
2015Z
Run Code Online (Sandbox Code Playgroud)

应该保留这些时代的不精确性.它们不应转换为:

2015-02-05T00:00:00.000Z
Run Code Online (Sandbox Code Playgroud)

我看过Java 8和Joda-Time,但他们似乎想把所有内容都视为特定的时间点,并且不能模拟不精确的性质或部分日期/时间.

更新:

使用Java 8,我可以这样做:

OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17+00:00");
System.out.println(dateTime.toString());
Run Code Online (Sandbox Code Playgroud)

这给了我:

2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)

这是我想要的,但是:

OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17.000+00:00");
System.out.println(dateTime.toString());
Run Code Online (Sandbox Code Playgroud)

也给了我:

2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)

请注意,java已经抛弃了毫秒精度.指定000与未指定任何内容相同,这似乎不太正确.

Suf*_*ori 7

在Java 8中,如果String是ISO 8601格式,则可以在a 上使用LocalDate.parse()LocalDateTime.parse()String而不为其提供模式.

parse(),从文本字符串(如2007-12-03)获取LocalDate的实例.该字符串必须表示有效日期,并使用DateTimeFormatter.ISO_LOCAL_DATE进行解析.

和,

DateTimeFormatter.ISO_LOCAL_DATE,这将返回一个能够格式化和解析ISO 8601的不可变格式化程序

例如,

String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
System.out.println("Date: " + aLD);

String strDatewithTime = "2015-08-04T10:11:30";
LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime);
System.out.println("Date with Time: " + aLDT);
Run Code Online (Sandbox Code Playgroud)

给,

Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30
Run Code Online (Sandbox Code Playgroud)

更新:

你的日期,也就是说"2015-02-05T02:05:17.000+00:00",当它们都是零时只会抛出零,如果纳秒的值不是零,那么它会显示得很好,但是,如果你想显示零,那么你可以简单地添加if/else块并附加零你的日期if你的纳秒为零(yourdate.getNano()==0),else按原样打印,

String dateTimestr = "2015-02-05T02:05:17.000+00:00";

OffsetDateTime dateTime = OffsetDateTime.parse(dateTimestr);

if ((dateTime.getNano() == 0) && (dateTimestr.length() > 25 ))
    System.out.println(dateTime.toLocalDateTime() + ".000Z");

else
    System.out.println(dateTime.toString());
Run Code Online (Sandbox Code Playgroud)

会给,

2015-02-05T02:05:17.000Z
Run Code Online (Sandbox Code Playgroud)

把你的约会时间改为,

String dateTimestr = "2015-02-05T02:05:17+00:00";
Run Code Online (Sandbox Code Playgroud)

给,

2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)

将日期改为

String dateTimestr = "2015-02-05T02:05:17.100+00:00";
Run Code Online (Sandbox Code Playgroud)

给,

2015-02-05T02:05:17.100Z
Run Code Online (Sandbox Code Playgroud)

改变它,

String dateTimestr = "2015-02-05T02:05:17Z";
Run Code Online (Sandbox Code Playgroud)

给,

2015-02-05T02:05:17Z
Run Code Online (Sandbox Code Playgroud)