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

What is the Date Format for "Fri Jun 05 00:00:00 PDT 2015"

我正在尝试确定要用于

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

您这个月还需要一个 M

EEE MMM dd HH:mm:ss zzzz yyyy

这在the Javadocs of SimpleDateFormat中提到:

Month: If the number of pattern letters is 3 or more, the month is interpreted as text; otherwise, it is interpreted as a number.

Locale与模式一样重要

无论适用的模式如何,重要的是使用 Locale 作为日期时间 parsing/formatting 类型(例如现代 API 的智能和生动 DateTimeFormatter ,或者臭名昭著且容易出错的 SimpleDateFormat of the legacy API) 是 Locale-sensitive。由于您的日期时间字符串是英文的,因此您应该使用 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]

无论出于何种原因,如果您需要来自 ZonedDateTime 对象的 java.util.Date 实例,您可以按如下方式进行:

Date date = Date.from(zdt.toInstant());

Trail: Date Time[=60= 中了解有关 modern date-time API* 的更多信息].

注意: 要求您的发布商以 Region/City 格式发送时区名称,如上面的输出所示。三字母时区名称(例如 PDT)不明确,因此容易出错。


* 无论出于何种原因,如果您必须坚持Java 6 或Java 7,您可以使用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