我正在尝试确定用于
的java日期格式字符串"Fri Jun 05 00:00:00 PDT 2015"
现在我正在使用
SimpleDateFormat format = new SimpleDateFormat("EEE MM dd HH:mm:ss zzzz yyyy");
但这会产生
com.fasterxml.jackson.databind.JsonMappingException:
java.text.ParseException: Unparseable date: "Fri Jun 05 00:00:00 PDT 2015"
(through reference chain:....
答案 0 :(得分:4)
本月你还需要一个M
:
EEE MMM dd HH:mm:ss zzzz yyyy
the Javadocs of SimpleDateFormat
中提到了这一点:
月份:如果模式字母数为3或更多,则将月份解释为文本;否则,它被解释为数字。
答案 1 :(得分:0)
Locale
与模式一样重要不管适用的模式如何,重要的是使用 Locale
作为日期时间解析/格式化类型(例如现代 API 的智能和生动的 DateTimeFormatter
,或臭名昭著且容易出错的旧 API 的 SimpleDateFormat
)对 Locale
敏感。由于您的日期时间字符串是英文的,您应该使用 Locale.ENGLISH
。
请注意,旧的日期时间 API(java.util
日期时间类型及其格式 API,SimpleDateFormat
)已过时且容易出错。建议完全停止使用,改用java.time
,modern date-time API*。
使用现代日期时间 API 的演示:
对于缩写的月份名称,您需要使用 MMM
而不是 MM
。
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String args[]) {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("EEE MMM d H:m:s zzz u", Locale.ENGLISH);
ZonedDateTime zdt = ZonedDateTime.parse("Fri Jun 05 00:00:00 PDT 2015", dtf);
System.out.println(zdt);
}
}
输出:
2015-06-05T00:00-07:00[America/Los_Angeles]
无论出于何种原因,如果您需要来自 java.util.Date
对象的 ZonedDateTime
实例,您可以按如下方式进行:
Date date = Date.from(zdt.toInstant());
从 modern date-time API 中了解有关 Trail: Date Time* 的更多信息。
注意:请您的发布商以 Region/City 格式发送时区名称,如上述输出所示。由三个字母组成的时区名称(例如 PDT)不明确,因此容易出错。
* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring 和 How to use ThreeTenABP in Android Project。