将字符串转换为iso日期格式

时间:2016-07-05 05:29:03

标签: java datetime string-formatting jodatime iso

所以我试图将字符串转换为日期的iso格式。 这是我试图转换的字符串" 2016-07-05 02:14:35.0" 我希望以这种格式提供iso 8601 " 2016-07-05T02:14:35.0"

到目前为止我有这个

 DateTimeFormatter format = DateTimeFormat.forPattern("YYYY-MM-DDTHH:mm:sszzz");
     new LocalDate();
    LocalDate newDate = LocalDate.parse(created,format);
     created = newDate.toString();

但它给了我这个例外

ERROR: Illegal pattern component: T; nested exception is java.lang.IllegalArgumentException: Illegal pattern component: T

我按照这些例子,我不知道我在这里做错了什么。 任何帮助,将不胜感激。

3 个答案:

答案 0 :(得分:4)

首先,该值为LocalDateTime不是 a LocalDate。如果你想最后得到一个日期,我先将它转换为LocalDateTime,然后取一部分。

执行日期格式化和解析时,请务必仔细阅读文档 。看起来你正在使用Joda Time(由于使用forPattern;如果你可以转向Java 8那将是有益的)。这意味着你应该阅读DateTimeFormat docs

您的模式目前存在问题:

  • 你正在使用' D'而不是';这意味着一年中的一天
  • 您已指定' T'没有引用它,并且它无论如何都不在模式中
  • 您忽略了价值的第二部分
  • 您已指定' zz'如果值中没有时区指示符。

这是一个有效的例子:

import org.joda.time.*;
import org.joda.time.format.*;

public class Test {
    public static void main(String[] args) {
        String text = "2016-07-05 02:14:35.0";
        DateTimeFormatter format = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S");
        LocalDateTime localDateTime = LocalDateTime.parse(text, format);
        System.out.println(localDateTime);
    }
}

如果实际想要在中间使用T解析值,您可以使用"yyyy-MM-dd'T'HH:mm:ss.S"模式 - 请注意{{1}引用它是因为它按字面处理而不是格式说明符。

请注意,这只是 解析。它没有"将字符串转换为ISO日期格式" - 它将字符串转换为T。如果您希望以ISO格式格式化该值,则需要使用具有适当格式的LocalDateTime。例如,您可能希望转换为DateTimeFormatter.print':

的格式
yyyy-MM-dd'T'HH:mm:ss.S

上面的代码只能处理一位数的秒数。您可以使用import org.joda.time.*; import org.joda.time.format.*; public class Test { public static void main(String[] args) { String text = "2016-07-05 02:14:35.0"; DateTimeFormatter parser = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss.S"); LocalDateTime localDateTime = LocalDateTime.parse(text, parser); DateTimeFormatter printer = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.S"); String formatted = printer.print(localDateTime); System.out.println(formatted); // Output 2016-07-05T02:14:35.0 } } 而不是.SSS进行解析,但是您确实需要计算出您希望输出在不同情况下的输出(例如100毫秒,您想要.1还是.100?)

答案 1 :(得分:1)

您的代码中存在一些错误:

  • 模式应该是&yyyy-MM-dd HH:mm:ss.SSS'。注意上层 和小写。
  • 使用LocalDateTime获取日期和时间。 LocalDate只保留日期。

更正的代码:

String created = "2016-07-05 02:14:35.000";
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime newDate = LocalDateTime.parse(created,format);
created = newDate.toString();
System.out.println(created);

答案 2 :(得分:-4)

使用以下格式转换

     String format = "yyyy-mm-dd hh:mm:ss"

您使用了错误的格式进行转换。使用T只是为了将日期与时间分开。 使用这样的格式

     String = "yyyy-MM-dd'T'HH:mm:ss"