在我的代码中解析平面文件后,我试图将平面文件中存在的字符串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
类中使用的模式是否存在问题,或者代码是否存在问题。
我已经在这个问题很长时间了。
答案 0 :(得分:6)
请告诉我这里的问题。
不确定。您有效地致电date.toString()
,该SimpleDateFormat
无法了解用于解析原始文本值的Date
的任何。一个Date.toString
只是即时。它没有每实例格式的概念。此外,它还不了解时区。您已经在PDT中给出了一个值,然后对其进行了解析......当您打印它时,它使用系统本地时区(IST)。那是Date
始终所做的事情。
如果您想以特定方式格式化DateFormat.format
,请使用特定时区的特定格式,请致电{{1}}。
答案 1 :(得分:3)
您的系统时区不同。输出显示IST - 或印度标准时间,与PDT相差12.5h。代码正确解析给定日期,即PDT(UTC -7)并打印出IST(UTC + 5h30)。
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));
答案 2 :(得分:1)
因为您没有格式化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"));