什么是“Fri Jun 05 00:00:00 PDT 2015”的日期格式

时间:2015-06-15 16:11:45

标签: java date-format simpledateformat

我正在尝试确定用于

的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:....

2 个答案:

答案 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.timemodern 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 desugaringHow to use ThreeTenABP in Android Project