gpt4 book ai didi

java - Java XMLGregorianCalendar 转换为 Java util.Date 时存在错误?

转载 作者:行者123 更新时间:2023-11-30 09:52:16 30 4
gpt4 key购买 nike

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

03-03-1933:03:03:03.

写入文件时转换为如下字符串:

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

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

03-03-1933:03:03:23

请注意在实际秒值上增加的额外 20 秒。

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

相关代码:

1) 从 Date 转换为 XMLGregorianCalendar:

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

// pass 'date2' to file writing code

2) 从 XMLGregorianCalendar 转换为 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 年生效。您可能需要下载 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

关于java - Java XMLGregorianCalendar 转换为 Java util.Date 时存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4282650/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com