日期值格式错误

时间:2012-09-25 15:46:45

标签: java parsing simpledateformat

在我的代码中解析平面文件后,我试图将平面文件中存在的字符串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类中使用的模式是否存在问题,或者代码是否存在问题。 我已经在这个问题很长时间了。

3 个答案:

答案 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"));