将字符串转换为日期,几乎完成了! [复制]

Posted

技术标签:

【中文标题】将字符串转换为日期,几乎完成了! [复制]【英文标题】:Converting a String to Date, almost done! [duplicate] 【发布时间】:2011-09-10 21:36:48 【问题描述】:

可能重复:Converting ISO8601-compliant String to java.util.Date

我正在尝试转换此字符串:

2011-06-07T14:08:59.697-07:00

到目前为止,我是这样做的:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
Date date1 = sdf.parse("2011-06-07T14:08:59.697", new java.text.ParsePosition(0));

几乎一切都很好,除了最重要的部分,时区! SimpleDateFormat 的问题在于,它需要 +/-hhmm 的 TimeZone 而我的是 +/-hh:mm 格式。

另外,我不知道为什么,这行得通:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S Z");
Date date1 = sdf.parse("2011-06-07T14:08:59.697 -0700", new java.text.ParsePosition(0));

但这不是(时区前的空格):

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ");
Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700", new java.text.ParsePosition(0));

将此日期2011-06-07T14:08:59.697-07:00 转换为 java 日期的正确格式是什么?

感谢您的帮助!

【问题讨论】:

***.com/questions/909022/… (我会说它是完全重复的,另一个问题也必须处理ISO8601时区的冒号问题) 哎呀,对不起。我应该关闭它还是标记它? 【参考方案1】:

这看起来像在 XML 中使用的 ISO 8601 标准日期和时间格式。不幸的是,Java 的SimpleDateFormat 不能正确支持该格式,因为它无法处理时区中的冒号。

但是,javax.xml 包包含可以处理这种格式的类。

String text = "2011-06-07T14:08:59.697-07:00";
XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(text);

如果您需要它作为java.util.Calendar,那么您可以致电toGregorianCalendar()

Calendar c2 = cal.toGregorianCalendar();

当然,您可以从中获得java.util.Date

Date date = c2.getTime();

您还可以使用流行的 Joda Time 库,它本机支持这种格式(并且具有比 Java 标准库更好的处理日期和时间的 API)。

【讨论】:

请注意,从 Java 7 开始,SimpleDateFormat 确实支持 ISO 8601 时区,带有 X 格式字符。所以你可以使用格式:yyyy-MM-dd'T'HH:mm.ss.SSSX【参考方案2】:

Java SimpleDateFormat 不支持时区信息中的冒号。您应该使用其他实现,例如JodaTime。

示例用法:

String dateString = "2011-06-07T14:08:59.697-07:00";
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
DateTimeFormatter dtf = DateTimeFormat.forPattern(pattern);
DateTime dateTime = dtf.parseDateTime(dateString);
System.out.println(dateTime);

maven pom.xml 依赖(如果需要):

<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>1.6.2</version>
</dependency>

希望对你有帮助。

【讨论】:

【参考方案3】:

S 的问题在于它会产生三位数的毫秒数,但不会解析三位数。

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");
System.out.println(sdf.parse("2011-06-07T14:08:59.697-0700"));

打印

Tue Jun 07 22:08:59 BST 2011

看来您需要删除时区中的:

【讨论】:

【参考方案4】:

看起来 DateFormat 找不到毫秒的结束和时区的开始。 正则表达式助你一臂之力!

这是一种解决方法:

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S Z");
    Date date1 = sdf.parse("2011-06-07T14:08:59.697-0700".replaceAll("(?=.5$)", " "));

正则表达式放入一个空格,这段代码执行没有错误。

【讨论】:

以上是关于将字符串转换为日期,几乎完成了! [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python - 将小时数转换为日期? [复制]

VB,如何将字符串型转化为日期型?

如何在EXCEL中将字符转成日期 如19970828转成1997-08-28

如何将日期转换为字符串格式。? [复制]

JavaScript 之日起对象(转)

php怎么将指定日期转换为时间戳?