tl;博士
ZonedDateTime.parse (
"20110913T100702.631 GMT" ,
DateTimeFormatter.ofPattern( "uuuuMMdd'T'HH:mm:ss.SSS z" )
).format(
DateTimeFormatter.ofLocalizedDateTime( FormatStyle.FULL , FormatStyle.SHORT )
.withLocale( Locale.US )
)
2011 年 9 月 13 日,星期二上午 10:07
ISO 8601
您的输入字符串几乎符合定义为标准ISO 8601 格式的“基本”版本的格式。 basic 一词的意思是尽量减少使用 ISO 8601 格式的更常见“扩展”版本所使用的分隔符。
String input = "20110913T100702.631 GMT" ;
使用 java.time
其他答案使用麻烦的旧日期时间类,现在被 java.time 类取代。
java.time 类在解析/生成字符串时默认使用许多标准的ISO 8601 格式。所以通常不需要指定格式模式。但是默认不支持这种特殊的basic格式,所以我们必须指定一个格式化模式。
DateTimeFormatter fInput = DateTimeFormatter.ofPattern ( "uuuuMMdd'T'HHmmss.SSS z" );
解析为ZonedDateTime。
ZonedDateTime zdt = ZonedDateTime.parse ( input, fInput );
要以所需格式生成表示ZonedDateTime 对象值的字符串,您可以定义指定格式模式。但我建议您改为让 java.time 为您自动本地化。
要本地化,请指定:
-
FormatStyle 确定字符串的长度或缩写。
-
Locale 确定 (a) 用于翻译日期名称、月份名称等的人类语言,以及 (b) 决定缩写、大写、标点符号、分隔符等问题的文化规范。
那么……
// Generate output string
Locale locale = Locale.US; // Or Locale.CANADA_FRENCH, Locale.ITALY, etc.
DateTimeFormatter fOutput =
DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL, FormatStyle.SHORT ) // Specify format style of date portion, then time-of-day portion.
.withLocale ( locale );
String output = zdt.format ( fOutput );
转储到控制台。
// Dump to console
System.out.println ( "input: " + input );
System.out.println ( "zdt.toString(): " + zdt );
System.out.println ( "output: " + output );
见this code run live at IdeOne.com。
输入:20110913T100702.631 GMT
zdt.toString(): 2011-09-13T10:07:02.631Z[GMT]
输出:2011 年 9 月 13 日星期二上午 10:07
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。