Java 日期值格式错误

Java 日期值格式错误,java,parsing,simpledateformat,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"); Syst

我正在尝试转换一个字符串
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  
你能告诉我这里有什么问题吗。我在
simpleadateformat
类中使用的模式是否有问题,或者代码是否有问题。 我已经为这件事挠头很久了

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

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


如果要在特定时区中使用特定格式以特定方式格式化日期,请调用
DateFormat。format

您的系统时区不同。输出显示IST或印度标准时间,与PDT相差12.5小时。代码正确地解析了给定的日期,即PDT(UTC-7)并打印出IST(UTC+5h30)

Java将日期存储为UTC日期。因此,当解析PDT日期时,Java会将其转换为UTC,并在内部将其存储为UTC时间戳。打印时,如果未指定时区,它将默认为系统时区,在您的情况下,系统时区将显示为IST

要指定准确的时区,请在SimpleDataFormat中指定:

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));

因为您没有格式化
日期
。看看这个例子

  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'
模式似乎过时了,并导致不可预测的结果

因此,设置
时区将解决此问题

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

您是否尝试为DateFormat对象设置时区?它有什么时区?你对这里的答案不满意吗?请接受答案。嗨,埃里克。谢谢。我已经做了你上面显示的更改,但它不起作用。它仍然显示与我原来问题相同的时差。对不起。。。剪切粘贴排版。我对代码片段做了一个小的编辑。谢谢,我知道我犯了什么错误。我有一个新的日期格式DateFormat f2=新的SimpleDataFormat(“yyyy-MM-dd-HH:MM:ss.SSS”);我想做一些类似于Date dateParsed=f2.parse(originalDate)的事情;将旧日期转换为新格式。我得到了一个java.text.ParseException:不可解析的日期:“Tue Aug 23 20:00:03 PDT 2011”您能告诉我如何解决这个错误吗。@vikeng21在新格式中,parsable date看起来像“2011-08-23 20:00:03.000”,但您没有为时区指定“z”,在我的时区中它将是“2011-08-24 06:00:03.000”你在这里得到答案了吗?请接受答案。谢谢Jon。我已经纠正了我犯的错误。我有一个新的日期格式DateFormat f2=新的SimpleDataFormat(“yyy-MM-dd HH:MM:ss.SSS”);我想做一些类似于Date dateParsed=f2.parse(originalDate)的事情;将旧日期转换为新格式。我得到一个java.text.ParseException:不可解析的日期:“2011年8月23日星期二20:00:03 PDT”。有可能这样做吗way@vikeng21:您的新格式没有提到时区-它不符合您获得的文本值,因此是的,它将无法以这种方式解析。您应该使用现有格式进行解析,然后使用新格式进行格式化。不过,您应该考虑明确设置时区。