【问题标题】:Date value wrongly formatted日期值格式错误
【发布时间】:2012-09-25 15:46:45
【问题描述】:

在我的代码中解析平面文件后,我试图将平面文件中存在的字符串 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 类中使用的模式是否存在问题,或者代码是否存在问题。 很长一段时间以来,我一直在摸不着头脑。

【问题讨论】:

  • 您是否尝试为您的 DateFormat 对象设置时区?它有什么时区?
  • 您对这里的答案不满意吗?请接受答案。

标签: java parsing simpledateformat


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 Jon.i 已纠正我犯的错误。我有一个新的日期格式 DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");我想做这样的事情 Date dateParsed = f2.parse(originalDate);将旧日期转换为新格式。我得到一个 java.text.ParseException: Unparseable date: "Tue Aug 23 20:00:03 PDT 2011" 。有可能这样做吗
  • @vikeng21:你的新格式没有提到时区——它不符合你得到的文本值,所以是的,它不会以这种方式解析。您应该使用 existing 格式进行解析,然后使用 new 格式进行格式化。不过,您应该考虑明确设置时区。
【解决方案2】:

您的系统时区不同。输出显示 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));

【讨论】:

  • 您好,Eric.Thanks.I have made the changes that you have shown above but it doesn't work it still show the same time difference as my original question.
  • 对不起...剪切和粘贴错字。我对代码 sn-p 做了一个小修改。
【解决方案3】:

因为您没有格式化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  

即使指定了'z' 模式,SimpleDateFormat 似乎也不关心时区。它在解析输入时设置时区。这就是我可以描述这种奇怪行为的方式。然后使用'z' 模式似乎已经过时并导致不可预测的结果。

所以设置TimeZone 将解决问题

f2.setTimeZone(TimeZone.getTimeZone("America/Los_Angeles"));

【讨论】:

  • 嗨罗曼。谢谢我知道我在做什么错误。只是跟进我有一个新的日期格式 DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");我想做这样的事情 Date dateParsed = f2.parse(originalDate);将旧日期转换为新格式。我收到一个 java.text.ParseException: Unparseable date: "Tue Aug 23 20:00:03 PDT 2011" 你能告诉我如何解决这个错误吗?
  • @vikeng21 在新格式中,可解析日期看起来像“2011-08-23 20:00:03.000”
  • 在新格式中,但是您没有为时区指定“z”,而在我的区域中,它将是“2011-08-24 06:00:03.000”
  • 你在这里得到答案了吗?请接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-05
  • 1970-01-01
相关资源
最近更新 更多