【发布时间】:2015-10-27 09:42:06
【问题描述】:
决定问这个,因为我在 StackOverflow 中找不到类似的例子。
我想使用 SimpleDateFormat 解析日期字符串及其时区。我(希望)我仔细阅读了文档,并编写了这个复制问题的程序。
import java.text.DateFormat;
import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Locale;
public class SDF {
private static final String FORMAT = "EEE, d MMM yyyy HH:mm:ss Z";
public static void main(String[] args) throws ParseException {
DateFormat formatter = new SimpleDateFormat(FORMAT, Locale.ENGLISH);
formatter.setLenient(false);
String dateString = args[0];
System.out.println(" Format: " + FORMAT);
Date date = formatter.parse(dateString);
System.out.println(" Parsed time in millis: " + date.getTime());
System.out.println(" Parsed timezone: " + formatter.getTimeZone().getDisplayName());
System.out.println(" Parsed offset: " + formatter.getTimeZone().getRawOffset() / 1000 / 60 / 60 + "hrs.");
}
}
如果我在输入字符串中使用“EDT”或任何其他受支持的时区指示符,则在 dateFormat 对象上调用 getTimeZone() 会返回正确的时区和与 GMT 的原始偏移量。
$ java SDF "Thu, 1 Jan 2015 00:00:00 EDT"
Parsed time in millis: 1420084800000
Parsed timezone: Eastern Standard Time
Parsed offset: -5hrs.
$ java SDF "Thu, 1 Jan 2015 00:00:00 PST"
Parsed time in millis: 1420099200000
Parsed timezone: Pacific Standard Time
Parsed offset: -8hrs.
但是,当我使用 +0000 表示法时,日期毫秒数会正确返回为自 UTC 纪元以来的时间,但时区始终默认为我的本地时区。
$ java SDF "Thu, 1 Jan 2015 00:00:00 +0000"
Parsed time in millis: 1420070400000
Parsed timezone: Central European Time
Parsed offset: 1hrs.
$ java SDF "Thu, 1 Jan 2015 00:00:00 -0800"
Parsed time in millis: 1420099200000
Parsed timezone: Central European Time
Parsed offset: 1hrs.
这是否意味着我只能在输入字符串中使用“EDT”、“BST”,还是我误用了 SimpleDateFormat API?
【问题讨论】:
标签: java date parsing timezone simpledateformat