我正在尝试将
String
转换为 DateTime
值,在解析代码中的平面文件后,该值作为 Date
对象存在于平面文件中。
我已经编写了代码来做到这一点,但是当我格式化日期时,它总是给我一个日期,比指定值多 1 天,有时它会添加
5:30
。
下面是代码:
DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy");
Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
System.out.println("---date----" + date);
上面的输出是
---date----Wed Aug 24 08:30:03 IST 2011
您能告诉我这里出了什么问题吗?我在
SimplaDateFormat
类中使用的模式有问题还是代码有问题?
您能让我知道这里出了什么问题吗?
当然。您实际上正在调用
date.toString()
,它不知道用于解析原始文本值的 SimpleDateFormat
的任何事情。
Date
是只是 一个瞬间。它没有每个实例格式的概念。此外,它不知道时区。您在 PDT 中给出了一个值,然后对其进行解析...当您“打印”它时,它正在使用系统本地时区(IST)。这就是 Date.toString
always所做的。 如果您想以特定方式格式化
Date
,在特定时区使用特定格式,请致电
DateFormat.format
。Java 将日期存储为 UTC 日期。 因此,当您解析 PDT 日期时,Java 会将其转换为 UTC 并在内部将其存储为 UTC 时间戳。 当您打印时,如果您不指定时区,它将默认为系统时区,在您的情况下将显示为 IST。
要指定准确的时区,请在 SimpleDateFormat 中指定:
DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy");
f.setTimeZone(TimeZone.getTimeZone("PDT"));
Date date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
System.out.println("---date----" + f.format(date));
date
。看例子
public static void main(String[] args){
Locale currentLocale = Locale.US;
DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale);
Date date = null;
Date today;
try {
today = new Date();
String result = f.format(today);
System.out.println("Locale: " + currentLocale.toString());
System.out.println("Result: " + result);
date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("---date----" + f.format(date));
}
将会输出
Locale: en_US
Result: Tue Sep 25 19:12:38 EEST 2012
---date----Tue Aug 23 20:00:03 PDT 2011
现在,您已经修改了一些代码
public static void main(String[] args){
Locale currentLocale = Locale.US;
DateFormat f = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale);
DateFormat f2 = new SimpleDateFormat("EEE MMM dd HH:mm:ss zz yyyy", currentLocale);
Date date = null;
Date today;
try {
today = new Date();
String result = f.format(today);
System.out.println("Locale: " + currentLocale.toString());
System.out.println("Result: " + result);
date = f.parse("Tue Aug 23 20:00:03 PDT 2011");
System.out.println("---date----" + f.format(date));
System.out.println("---date----" + f2.format(date));
} catch (ParseException e) {
e.printStackTrace();
}
}
输出到
Locale: en_US
Result: Tue Sep 25 20:42:10 EEST 2012
---date----Tue Aug 23 20:00:03 PDT 2011
---date----Wed Aug 24 06:00:03 EEST 2011
似乎
SimpleDateFormat
不关心时区,即使指定了
'z'
模式。它在解析输入时设置时区。这就是我可以描述的奇怪行为。那么使用 'z'
模式似乎已经过时并导致不可预测的结果。 因此设置
TimeZone
将解决问题
f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));