2016-07-05 141 views
0

所以我试图将字符串转换为日期的iso格式。 这是我想要转换的字符串“2016-07-05 02:14:35.0” 我希望以此格式使用iso 8601 “2016-07-05T02:14:35.0”将字符串转换为iso日期格式

我有这个迄今为止

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 

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

+0

参见:https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html#ISO_INSTANT。如果这样做不能帮助你改变模式到'YYYY-MM-DD'THH:mm:sszzz' – shachar

+0

想问一个问题吗? ''2016-07-05 02:14:35.0“.replace(”“,”T“)' –

回答

4

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

执行日期格式化和解析时,请务必仔细阅读文档。它看起来像你使用乔达时间(由于使用forPattern;如果你可以移动到Java 8将是有益的)。这意味着你应该阅读DateTimeFormat docs

目前存在的问题与你的模式:

  • 你使用 '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); 
    } 
} 

如果实际上想在中间与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 
    } 
} 

上面的代码将只处理一个单一的数字几分之一秒。你可以使用.SSS而不是.S进行解析,但是你真的需要确定你想在不同的情况下输出什么(例如100毫秒,你想要.1还是.100?)。

+0

但是我想要的值没有T。我认为有一种方法可以自动放置T. – MNM

+0

@MNM:但你解析*的值不会。你没有向我们展示你想要的结果。如果您需要转换为其他格式,则需要两个不同的格式化程序。如果你提供预期的输出,它会有所帮助... –

+0

我想要这样的iso格式如此yyyy MM dd T HH mm ss T是我想放在那里的东西。我不想拆分原始字符串,然后在其中添加一个T,然后将所有这些一起串接起来 – MNM

-3

使用以下格式

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

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

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

这也是错误的格式。 –

+0

“yyyy-MM-dd'T'HH:mm:ss”使用此 –

+1

这是*仍然*不正确 - 它不包括一秒的小数部分,您呈现的第一个模式仍然使用分钟而不是几个月,并且12小时,你提交的第二个片段甚至不会编译。 –

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); 
相关问题