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

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

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

2015-02-05T02:05:17.000+00:00
2015-02-05T02:05:17+00:00
2015-02-05T02:05:17Z

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

2015-02-05T02:05:17.000Z

我的第一个想法是仅使用Converting ISO 8601-compliant String to java.util.Date中的一种技术来解析它们,然后转换回所需的字符串,但是在处理不太精确的日期/时间时,这种方法会崩溃,例如:

2015-02-05T02:05:17Z
2015-02-05T02:05Z
2015-02-05Z
2015-02Z
2015Z

这些时间的不精确性应予以保留。它们不应转换为:

2015-02-05T00:00:00.000Z

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

更新:

使用Java 8,我可以做到:

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

这给了我:

2015-02-05T02:05:17Z

这是我想要的,但是:

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

还给我:

2015-02-05T02:05:17Z

请注意,java放弃了毫秒精度。指定000与未指定任何内容一样,这似乎不太正确。

参考方案

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

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);

给,

Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30

更新:

您的日期,即"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());

会给,

2015-02-05T02:05:17.000Z

将您的日期更改为

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

给,

2015-02-05T02:05:17Z

将日期更改为

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

给,

2015-02-05T02:05:17.100Z

更改为

String dateTimestr = "2015-02-05T02:05:17Z";

给,

2015-02-05T02:05:17Z

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…

Java:从类中查找项目名称 - java

仅通过类的实例,如何使用Java反射或类似方法查找项目名称?如果不是,项目名称(我真正想要的是)可以找到程序包名称吗? 参考方案 项目只是IDE使用的简单组织工具,因此项目名称不是类或JVM中包含的信息。要获取软件包,请使用Class#getPackage()。然后,可以调用Package#getName()将包作为您在代码的包声明中看到的String来获取…