Java XMLGregorianCalendar转换为Java util.Date时出现错误?

Java XMLGregorianCalendar转换为Java util.Date时出现错误?,java,datetime,date,Java,Datetime,Date,我将日期/时间值作为Java日期对象从基于RAP的UI中读取,并将其作为XMLGregorianCalendar对象传递给实际的文件编写代码,从而将日期/时间值写入XML文件。相应的类是自动生成的,我无法控制它们。我输入的日期是: 03-03-1933:03:03:03 写入文件时,它被转换为以下字符串: 1933-03-03T03:03:03.161+05:53 现在,当我读回日期以在UI中显示以进行编辑时,它显示为: 03-03-1933:03:03:23 请注意,实际秒值增加了额外的20秒

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

03-03-1933:03:03:03

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

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

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

03-03-1933:03:03:23

请注意,实际秒值增加了额外的20秒

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

相关代码:

1) 从日期转换为日期:

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

// pass 'date2' to file writing code
2) 从
xmlgorianicalendar
转换为
Date

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

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

编辑:要准确验证正在发生的情况,请尝试:

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

步骤1的第二行出现了一些奇怪的情况:将
日期
转换为
gegorianalendar
似乎会给它一个非常奇怪的时区:
+05:53
。同样奇怪的是,它的偏移量为161毫秒。能否提供代码,说明您是如何创建日期的?在我的机器上,
date2
产生
1933-03-03T03:03:03.000+01:00
(这对于我的阿姆斯特丹时区是正确的)。您好,谢谢您的回答。我使用两个SWT DateTime对象。一个是日期,另一个是时间。下面是相关代码:int day=dateCtrl.getDay();int month=dateCtrl.getMonth();int year=dateCtrl.getYear();inthrs=timeCtrl.getHours();int mins=timeCtrl.getMinutes();int seconds=timeCtrl.getSeconds();日历=Calendar.getInstance();日历设置(年、月、日、小时、分钟、秒);Date=calendar.getTime();这是否与印度的时区为UTC+05:30有关,但
xmlgoriiancalendar::getTimezone()
返回
int
(UTC偏移的小时数)?这似乎是该类型的一个弱点。尼泊尔(UTC+05:45)和阿富汗(UTC+04:30)也值得关注。您好,谢谢您的回答。我在印度,但我使用“en_US”作为语言环境。语言环境和时区是不相关的,答案不清楚。所以en_US地区不相关。如果您使用的是亚洲/加尔各答时区,这似乎是解释的一部分。