Java 字符串到日期、ParseException
我有一个名为 DateCompareOld 的字符串,它的值为“Fri Aug 12 16:08:41 EDT 2011”
。我想将其转换为日期对象。
SimpleDateFormat dateType = new SimpleDateFormat("E M dd H:m:s z yyyy");
Date convertDate = dateType.parse(DateCompareOld);
但每次我尝试这个时,我都会遇到解析异常。我尝试过其他 SimpleDateFormat 格式化标准,但总是失败。
建议?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
尝试以下格式:
快速测试:
输出为 CDT,因为那是我所在的位置,但值是正确的。
Try this format:
Quick test:
Output is in CDT, since that's where I am, but the value is right.
java.time
旧版日期时间 API(
java.util
日期时间类型及其格式化 API,SimpleDateFormat
)已过时且存在错误 -易于。建议完全停止使用它们并切换到 java.time,即 现代日期时间 API*。另一件需要注意的重要事情是,您的字符串包含
English
文本,因此您必须使用Locale.ENGLISH
,这样当您的代码被执行时,您就不会收到异常或错误结果。在Locale
不是English
的 JVM 上运行。无论如何,永远不要使用日期时间解析/格式化类型(例如SimpleDateFormat
、DateTimeFormatter
等),没有Locale
,因为这些类型对Locale
敏感。使用现代日期时间 API 的演示:
输出:
如果您需要一个
java.util.Date
对象,您可以通过以下方式获取它:如下所示:从 Trail: Date 了解有关现代日期时间 API 的更多信息时间。
使用旧版 API:
请注意,
java.util.Date
对象不是像 现代日期时间类型;相反,它表示自称为“纪元”的标准基准时间(即 1970 年 1 月 1 日 00:00:00 GMT(或 UTC))以来的毫秒数。当您打印java.util.Date
对象时,其toString
方法返回 JVM 时区中的日期时间(根据该毫秒值计算)。如果您需要打印不同时区的日期时间,则需要将时区设置为SimpleDateFormat
并从中获取格式化字符串。* 无论出于何种原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport 将大部分 java.time 功能向后移植到 Java 6 和 Java 6 7. 如果您正在处理 Android 项目,并且您的 Android API 级别仍然不符合 Java-8,请检查 通过脱糖提供 Java 8+ API 和 如何在Android项目中使用ThreeTenABP。
java.time
The legacy date-time API (
java.util
date-time types and their formatting API,SimpleDateFormat
) are outdated and error-prone. It is recommended to stop using them completely and switch tojava.time
, the modern date-time API*.Another important thing to note is that your string has
English
text and therefore you must useLocale.ENGLISH
so that you do not get an exception or some wrong result when your code is run on a JVM whoseLocale
is notEnglish
. Anyway, NEVER use a date-time parsing/formatting type (e.g.SimpleDateFormat
,DateTimeFormatter
etc.) withoutLocale
because these types areLocale
-sensitive.Demo using modern date-time API:
Output:
If at all, you need a
java.util.Date
object, you can obtain it as follows:Learn more about the modern date-time API from Trail: Date Time.
Using the legacy API:
Note that the
java.util.Date
object is not a real date-time object like the modern date-time types; rather, it represents the number of milliseconds since the standard base time known as "the epoch", namelyJanuary 1, 1970, 00:00:00 GMT
(or UTC). When you print an object ofjava.util.Date
, itstoString
method returns the date-time in the JVM's timezone, calculated from this milliseconds value. If you need to print the date-time in a different timezone, you will need to set the timezone toSimpleDateFormat
and obtain the formatted string from it.* For any reason, if you have to stick to Java 6 or Java 7, you can use ThreeTen-Backport which backports most of the java.time functionality to Java 6 & 7. If you are working for an Android project and your Android API level is still not compliant with Java-8, check Java 8+ APIs available through desugaring and How to use ThreeTenABP in Android Project.
请注意,传递给 SimpleDateFormat() 的字符串应更正为“EEE MMM dd HH:mm:ss z yyyy”
以下是代码:
Note the String passed to SimpleDateFormat() should be corrected to "EEE MMM dd HH:mm:ss z yyyy"
Here is the code: