当前位置: 首页 > 知识库问答 >
问题:

从EST到UTC的Java日期转换

颛孙喜
2023-03-14

我在一个应用程序API (DFC)下工作,它给了我一个类似日期的对象(IDfTime)。API自动将日期转换为当地时区(EST)。我需要转换为UTC发送到oracle数据库。出于某种原因,我的代码增加了一个月。我不明白。有人能解释一下这个吗?

修改日期是由应用 API html" target="_blank">返回的类似日期的对象。我已将其转换为字符串,它看起来像预期的那样(对我来说是 EST)。因此,使用日历和简单日期格式将其转换为特定格式的字符串,我可以在SQL更新语句中使用UTC字符串将其发送到数据库。

注意:我正在将调试语句写入由应用程序而不是标准输出生成的批处理作业日志文件。是的,有更好的方法,但这应该是一个快速小部件。

//adjust modify date for UTC to send to database
String dfcDatePattern = "mm/dd/yyyy hh:mi:ss";
String javaDatePattern = "MM/dd/yyyy HH:mm:ss";
String oracleDatePattern = "MM/DD/YYYY HH24:MI:SS";

String strModifyDate = modifyDate.asString(dfcDatePattern);
if (m_debugMode) m_File.writeBytes("DFC Modify Date String: " + strModifyDate + NEWLINE);

TimeZone localTimeZone = TimeZone.getDefault();
TimeZone utcTimeZone = TimeZone.getTimeZone("UTC");
GregorianCalendar cal = new GregorianCalendar();
cal.setTimeZone(localTimeZone);
if (m_debugMode) m_File.writeBytes("DFC Year: " + modifyDate.getYear() + NEWLINE);
if (m_debugMode) m_File.writeBytes("DFC Month: " + modifyDate.getMonth() + NEWLINE);
if (m_debugMode) m_File.writeBytes("DFC Day: " + modifyDate.getDay() + NEWLINE);
if (m_debugMode) m_File.writeBytes("DFC Hour: " + modifyDate.getHour() + NEWLINE);
if (m_debugMode) m_File.writeBytes("DFC Minutes: " + modifyDate.getMinutes() + NEWLINE);
if (m_debugMode) m_File.writeBytes("DFC Seconds: " + modifyDate.getSeconds() + NEWLINE);
cal.set(modifyDate.getYear(), modifyDate.getMonth(), modifyDate.getDay(), modifyDate.getHour(), modifyDate.getMinutes(), modifyDate.getSeconds());
if (m_debugMode) m_File.writeBytes("Converted Modify Date: " + cal.toString() + NEWLINE);
SimpleDateFormat sdf = new SimpleDateFormat(javaDatePattern);
if (m_debugMode) m_File.writeBytes("Modify Date in Local Time Zone: " + sdf.format(cal.getTime()) + NEWLINE);
sdf.setTimeZone(utcTimeZone);
if (m_debugMode) m_File.writeBytes("Modify Date in UTC Time Zone: " + sdf.format(cal.getTime()) + NEWLINE);

updateQueryString = "execute exec_sql with query = 'update dm_sysobject_s set r_modify_date = TO_DATE(''" + sdf.format(cal.getTime())  + "'',''" + oracleDatePattern + "'') where r_object_id = ''" + objectIdString + "'' '";

输出:

DFC Modify Date String: 03/30/2016 11:44:30 [yep, looks good]
DFC Year: 2016
DFC Month: 3   [month looks good here]
DFC Day: 30
DFC Hour: 11   [EST hour]
DFC Minutes: 44
DFC Seconds: 30

[是的,每个部分看起来都很好]

Converted Modify Date: java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,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]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=3,WEEK_OF_YEAR=14,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=90,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=3,HOUR_OF_DAY=11,MINUTE=44,SECOND=30,MILLISECOND=399,ZONE_OFFSET=-18000000,DST_OFFSET=3600000]

[扔掉这个,看看我是否能弄清楚发生了什么。我认为这一切看起来都很好]

Modify Date in Local Time Zone: 04/30/2016 11:44:30

【不好!时间是正确的,但它增加了一个月!?UTC时差只有4小时!]

Modify Date in UTC Time Zone: 04/30/2016 15:44:30

[不好!时间按预期正确调整,但仍增加了一个月]

exec_sql to update r_modify_date: execute exec_sql with query = 'update dm_sysobject_s set r_modify_date = TO_DATE(''04/30/2016 15:44:30'',''MM/DD/YYYY HH24:MI:SS'') where r_object_id = ''09ae12f980002934'' '

[这就是我想要的SQL的样子;同一天,但时间根据UTC偏移进行了调整。但是月份Rest了。SQL语法很好(由于API语法看起来很奇怪);它更新了数据库中的记录;只是月份不对。]

我想我可以通过添加四个小时来暴力破解硬编码偏移量,但我认为以上是“正确”的方式。为什么不起作用?

共有1个答案

闽哲
2023-03-14

在java.util中。公历,月为零。要表示三月,你应该通过2而不是3。

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="America/New_York",offset=-18000000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/New_York,offset=-18000000,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]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=2,WEEK_OF_YEAR=14,WEEK_OF_MONTH=5,DAY_OF_MONTH=30,DAY_OF_YEAR=90,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=5,AM_PM=1,HOUR=3,HOUR_OF_DAY=11,MINUTE=44,SECOND=30,MILLISECOND=399,ZONE_OFFSET=-18000000,DST_OFFSET=3600000]
 类似资料:
  • 问题内容: 我需要有关此java方法的一些建议。此方法的目的是采用表示日期的字符串-该字符串是从EST时区中的日期创建的-并将其转换为UTC时区中的java Date对象。 我看到的问题是dt的值似乎已关闭。例如,如果dateString为‘10 / 16/2012 12:06 PM’-我期望dt(以UTC为单位)的值类似于“ 2012年10月16日,星期二,下午4:06”。取而代之的是,dt的值

  • 问题内容: 我有一个带有日期/时间值的字段,如下所示: 在UTC中。在查询中如何将其转换为EST? 我正在尝试类似的操作,但是会引发错误。 问题答案: 我必须对其进行一些微调,以使其在我的数据库上工作,但这是可行的: 关键是“在时区”语法。

  • 我在java中使用ZonedDateTime作为变量。 我想将变量的值(默认UTC时区)转换为“America/New York”的时区,以便日期保持不变。 示例4:00 am UTC=12:00 am EST。从ZonedDateTime变量中添加或减去小时,以使日期不变。 我们如何实现这种转换?

  • 我需要转换一个日期列,数据库中的日期正好偏离了5个小时。时间保持为UTC,当他们查看应用程序时,它会显示EST时区。应用程序自动转换时间。UTC比东部标准时间提前了5秒。以下代码似乎为大多数时间戳固定了时间和日期,但是,有没有办法设置和偏移?报告回顾一天,并应将转换后的UTC时间返回到EST时间。

  • 问题内容: 该java.util.Date 方法显示当地时区的日期。 在几种常见的情况下,我们希望以UTC格式打印数据,包括日志,数据导出以及与外部程序的通信。 在UTC中创建String表示形式的最佳方法是什么? 如何用更好的格式替换无法排序的juDate 格式(感谢@JonSkeet!)? 附录 我认为以自定义格式和时区打印日期的标准方法非常繁琐: 我一直在寻找像这样的单线: 问题答案: 遵循

  • 如何将EST时区日期(已转换并获取字符串)转换为带有时区的日期格式?我尝试更改时区,得到了字符串格式的完美日期时间,但当我将该字符串日期解析为日期格式时,它为我提供了本地Android系统时区时间。 提前感谢您的帮助。 它以字符串形式给出最新的日期格式(当前日期)。它给我的是格式日期(currentdate)