2

在我的代码中解析平面文件后,我试图将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课堂上使用的模式有问题还是代码有问题。很长一段时间以来,我一直在为此挠头。

4

3 回答 3

6

你能告诉我这里有什么问题吗?

当然。您实际上是在调用date.toString(),它不知道用于解析原始文本值的任何内容。SimpleDateFormatADate只是时间的一瞬间。它没有每个实例格式的概念。此外,它不知道时区。您在 PDT 中给出了一个值,然后对其进行了解析......当您打印它时,它使用的是系统本地时区 (IST)。Date.toString 总是这样。

如果您想以Date特定方式格式化 a,在特定时区使用特定格式,请调用DateFormat.format.

于 2012-09-25T15:48:10.510 回答
3

您的系统时区不同。输出显示 IST - 或印度标准时间,与 PDT 相差 12.5 小时。该代码正确解析了给定的日期,即 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));
于 2012-09-25T15:48:51.117 回答
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"));
于 2012-09-25T16:16:37.670 回答