【发布时间】:2011-12-22 10:53:30
【问题描述】:
我尝试使用 SimpleDateFormat 来完成这项工作, 但我不知道如何处理字符串“2008-08-01T15:47:00.557”中的 T,谁能帮我解决这个问题?
【问题讨论】:
标签: java date-format
我尝试使用 SimpleDateFormat 来完成这项工作, 但我不知道如何处理字符串“2008-08-01T15:47:00.557”中的 T,谁能帮我解决这个问题?
【问题讨论】:
标签: java date-format
您需要使用格式“yyyy-MM-dd'T'hh:mm:ss.SSS”。
在附加说明中,如果您尝试处理 xml 日期,请查看以下问题:Convert Java Date into XML Date Format (and vice versa)
【讨论】:
我不太确定。但是,如果我没记错的话,您必须在格式中用单引号将 T 括起来。
String yourFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
【讨论】:
因为您的示例是 24H 格式,而不是 AM/PM 格式
你应该使用 HH(大写)而不是 hh
喜欢这个
String EXT_JS_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
【讨论】:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
API 中几乎给出了这个确切的示例,请查看 :-) http://download.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
【讨论】:
您的字符串格式恰好符合ISO 8601 标准。
Java 8 及更高版本包含 java.time 框架以取代问题和其他答案中使用的旧日期时间类。
新类在解析/生成字符串时默认使用 ISO 8601 标准。所以无需指定编码格式模式。
您的输入字符串缺少任何时区或offset-from-UTC。因此,您必须指定此字符串有意义的时区。如果您不指定,解析会自动应用您的 JVM 当前的默认时区。不好,因为该默认值可能不是用于您的字符串的区域。此外,JVM 的默认值可以随时更改,即使在运行时也是如此。
如果您的字符串用于 UTC 作为时区,只需附加一个 Z(“Zulu”的缩写,表示 UTC)。然后解析为Instant,UTC 时间线上的一个时刻。
String input = "2008-08-01T15:47:00.557";
Instant instant = Instant.parse ( input + "Z" );
转储到控制台。
System.out.println ( "instant: " + instant );
即时:2008-08-01T15:47:00.557Z
如果您的字符串用于其他时区,我们需要指定。使用正确的时区名称(切勿使用媒体上看到的 3-4 个字母代码)。这里我们随意选择蒙特利尔时区。
对于格式化模式,我们使用 ISO 8601 的预定义格式之一:DateTimeFormatter.ISO_LOCAL_DATE_TIME(“LOCAL”表示输入字符串中没有嵌入时区或偏移量)。
String input = "2008-08-01T15:47:00.557";
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
formatter = formatter.withZone ( zoneId );
ZonedDateTime zdt = ZonedDateTime.parse ( input , formatter );
转储到控制台。我们还从ZonedDateTime 中提取Instant,以便您可以在UTC 中看到同一时刻。通常最好在您的业务逻辑中使用 UTC;只应用一个时区输出给用户。
System.out.println ( "input: " + input + " | zdt: " + zdt + " | instant of zdt: " + zdt.toInstant () );
输入:2008-08-01T15:47:00.557 | zdt: 2008-08-01T15:47:00.557-04:00[美国/蒙特利尔] | zdt 瞬间:2008-08-01T19:47:00.557Z
【讨论】: