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与未指定任何内容相同,这似乎不太正确.
在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)