Java XMLGregorianCalendar中的错误转换为Java util.Date?

时间:2010-11-26 05:04:06

标签: java datetime date

我正在将日期/时间值写入XML文件,方法是将基于RAP的UI中的日期作为Java Date对象读取,并将其作为XMLGregorianCalendar对象传递给实际的文件编写代码。相应的类是自动生成的,我无法控制它们。我输入的日期是:

  

1933年3月3日:03:03:03

在文件中写入时,它被转换为以下字符串:

  

1933-03-03T03:03:03.161 + 05:53

现在,当我读回日期以在UI中显示它以进行编辑时,它出现在:

  

1933年3月3日:03:03:23

请注意额外的20秒加到实际的秒值。

为什么会这样?这是API中的一些错误吗?任何帮助将不胜感激!

相关代码:

1)从XMLGregorianCalendar转换为Date

GregorianCalendar calendar = new GregorianCalendar(); 
calendar.setTimeInMillis(date.getTime());
XMLGregorianCalendar date2;
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);

// pass 'date2' to file writing code

2)从Date转换为XMLGregorianCalendar

XMLGregorianCalendar cal = getDateFromFile(); // XML date read from file
Date date = cal.toGregorianCalendar().getTime();

// show Date object in UI, dateCtrl and timeCtrl are SWT DateTime objects

GregorianCalendar calendar = new GregorianCalendar();  
calendar.setTime( date );

dateCtrl.setDate( calendar.get( GregorianCalendar.YEAR ),
    calendar.get( GregorianCalendar.MONTH ),
    calendar.get( GregorianCalendar.DAY_OF_MONTH ) );

timeCtrl.setTime( calendar.get( GregorianCalendar.HOUR_OF_DAY ),
    calendar.get( GregorianCalendar.MINUTE ),
    calendar.get( GregorianCalendar.SECOND) );

1 个答案:

答案 0 :(得分:2)

在大约1968年之前,有各种奇怪的偏移,特别是在世界欠发达地区。你没有说你正在使用什么语言环境,但如果它在印度,那么曾经有一个名为Howra Mean Time的东西有这种偏移。我不知道它是否在1933年生效。您可能需要为您的语言环境下载tz database并检查该日期的配置。

编辑:要确切地确认发生了什么,请尝试:

GregorianCalendar c = new GregorianCalendar();
TimeZone tz = c.getTimeZone();
System.out.println(tz);

int tzo = tz.getOffset(date.getTime());
System.out.println(
      tzo/3600000 + ":" + 
      (tzo/60000)%60 + ":" + 
      (tzo/1000)%60 + "." + 
      tzo%1000);

这将告诉你系统认为当前时区是什么,以及1933年在有问题的日期生效的时区偏移。当我在我的系统中运行时,我得到:

sun.util.calendar.ZoneInfo[id="America/Chicago",offset=-21600000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/Chicago,offset=-21600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
-6:0:0.0

然而,如果我换一行:

GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("IST"));
然后我得到:

sun.util.calendar.ZoneInfo[id="IST",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
5:53:20.0