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

MNM*_*MNM 0 java datetime iso string-formatting jodatime

所以我试图将字符串转换为日期的 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();
Run Code Online (Sandbox Code Playgroud)

但它给了我这个例外

ERROR: Illegal pattern component: T; nested exception is java.lang.IllegalArgumentException: Illegal pattern component: T
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 5

首先,该值是 a LocalDateTime而不是a LocalDate。如果您想最终确定一个日期,我会将其转换为LocalDateTime第一个,然后再取其中的日期部分。

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

您的模式当前存在的问题:

  • 您使用的是“D”而不是“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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你真的想解析T中间的值,你会使用一种模式"yyyy-MM-dd'T'HH:mm:ss.S"- 注意然后T是如何引用的,所以它被按字面处理而不是作为格式说明符。

请注意,这只是解析。它不是“将字符串转换为 ISO 日期格式”——而是将字符串转换为LocalDateTime. 如果您随后想将该值格式化为 ISO 格式,则需要使用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
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码只能处理一位数的秒数。您可以使用.SSS而不是解析.S,但您确实需要弄清楚在不同情况下您希望输出是什么(例如,对于 100 毫秒,您想要 0.1 还是 .100?)。