Java and SOAP data client request as UTC time and save as EST time
我有一个SOAP客户机请求,需要将日期响应转换为EST时间。
在我的屏幕上,我选择了上午11:45,我想在数据库中保存上午11:45。
但是SOAP请求的形式是:
2012年11月24日16:45:00.000Z
在Java代码中,日期打印为:
2012年11月24日星期六11:45:00美国东部时间…
然而,我们进行了另一个Web服务调用,该调用最终保存到数据库(SQL Server)中:2012年11月24日16:45
1 2 3 4
| Calendar incomingWebServiceCalendarObject = fromWebService. getDateTime()
Calendar outgoingWebServiceCalendarObject = incomingWebServiceCalendarObject ;
webServiceBean. setDateTime(outgoingWebServiceCalendarObject ); |
…如何保存为2012-11-24 11:45?
此外,这是公历:
Java.U.FieldScRealDeal[Trime],AdLeFieldStSt= true,Apple FieldStase= Tral. ZONEFION[ID="美国/NeXYYOK",偏移量=18000000,dStayLe= true,过渡=235,Lastrue= Java.UTI.SimuleMeTeal[ID]=美国/NeXyYyk,偏移=-18000000,DSTealSt==3600000,UsDayAyLoe= true,StistyValue= 0,StistModE=3,startmonth=2,startda天=8,startdayOfWeek=1,starttime=7200000,starttimemode=0,endmode=3,endmon月=10,endda天=1,enddayOfWew=1,endtime=7200000,endtimemode=0]],FirstDayOfWew=1,最小DayInFirstWew=1,ERA=1,年=2012,月=10,周u年=47,周u月=4,月日_月日=24,日_年日=329,周日_周日=7,日_周日=7,周日_,周日_日_日=7,日_日_日,周日_日=7,日_日_日__week_in_month=4,am_pm=0,hour=11,hour_of_day=11,minute=45,second=0,millisecond=0,zone_offset=-18000000,dst_offset=0]
…
我做了下面的工作,这看起来是可行的,这是一个合适的方法吗,代码根据我的需求试图完成什么?
1 2 3 4
| final long offset = this. secondaryScheduleTime. getTimeInMillis() + TimeZone. getTimeZone("EST"). getRawOffset();
final Date estTime = new Date(offset );
final Calendar c2 = Calendar. getInstance();
c2. setTime(estTime ); |
- 我严重怀疑您是否希望将数据存储在本地时区的数据库中,除非您也在用数据存储时区。使用隐式本地时区进行存储是一个等待发生的头痛问题。
您的初始SOAP请求以UTC(.000Z是您的时区信息)的形式传入,之后,您的日历对象将其转换为东部时间,zone=sun.util.calendar.ZoneInfo[id="America/New_York"...进行显示,然后您将原始SOAP信息保存到数据库中。
您不显示的是如何持久化数据库以及使用哪个时间戳。
我只能想到两种情况:
您的数据库仅采用UTC格式,不保存时区信息。这意味着每次从数据库调用都是UTC,时区由代码决定。
您的数据库通过timestamp数据类型保存时区信息,但您正在将来自SOAP请求的UTC信息发送到数据库,而不是本地日历对象。
我认为您提供的解决方案满足上述列表中的2,但同样,在没有看到任何其他细节的情况下,我认为很难确定。
我建议删除一些断点,并单步执行代码,以查看创建日期对象的确切时间/位置,以及使用什么信息。
- 我修改了我的职位。实际上,我们从一个Web服务调用中获取"calendar"对象,并将其提供给另一个Web服务。在实际保存到SQL Server数据库的第二个Web服务上。我无法访问正在进行保存的Web服务代码(C)。
- 除非远程SQL Server安装程序将架构设置为使用datetimeoffset作为日期的数据类型,否则所有日期都存储在UTC中。这就是为什么数据库总是显示UTC的一个很好的原因。有关详细信息,请参阅此处:msdn.microsoft.com/en-us/library/bb630289.aspx
- 但是,您发布的代码显示场景2实际上正在发生:Calendar outgoingWebServiceCalendarObject = incomingWebServiceCalendarObject;,应该是Calendar outgoingWebServiceCalendarObject = c2;。
- 你说得对,我试试解决办法。这是一个好方法吗?
- 视情况而定-如果将本地时间反映为UTC,那么数据库现在和将来都能满足所有业务需求,那么就疯狂吧-但是我强烈建议不要将UTC与本地时间混合使用。如果某个点出现在您需要UTC值的地方,那么将是一场噩梦。考虑到这一点:您有一个服务订单系统,它为全球的技术人员提供服务,如果他们需要服务订单的创建日期,它将反映在EST中。假设他们在迪拜(+4UTC),您的数据库时间将被关闭-8/-9(取决于DST),需要相应增加,而不是本地化。
- 如果您能够将其保持为UTC,那么您的代码将只需要考虑本地计算机的区域设置,以便整理出正确的时区差异,确保最终用户的时间始终是本地时间,而不管他们在世界何处。