我有应用程序,我已将时区设置为UTC,如下所示:
// set default time zone to UTC
TimeZone.setDefault(TimeZone.getTimeZone(ZoneOffset.UTC));
这适用于我们作为UTC存储在数据库中的所有日期字段。 但是一个日期已经在UTC中出现,因此上面的时区将再次以UTC格式设置。
如何避免在UTC中再次设置?
一些代码 -
public static void main(String[] args) throws DatatypeConfigurationException {
DatatypeFactory datatypeFactory = DatatypeFactory.
newInstance();
// set default time zone to UTC
TimeZone.setDefault(TimeZone.getTimeZone(ZoneOffset.UTC));
// coming from external program in UTC but assigned it here for reference
long someTimeToBeInUTC = 1528371000000L;
GregorianCalendar start = new GregorianCalendar();
start.setTimeInMillis(someTimeToBeInUTC);
XMLGregorianCalendar startXmlCalendar =
datatypeFactory.newXMLGregorianCalendar(start);
System.out.println(startXmlCalendar.
toGregorianCalendar().getTime());
}
想想我有一个时间someTimeToBeInUTC
,无论时区如何,然后由于行TimeZone.setDefault(TimeZone.getTimeZone(ZoneOffset.UTC))
它将其设置为UTC。
然后在hibernate中我有表的hbm.xml中的属性,我存储了这个值 -
<property name="startTime" type="timestamp">
<column name="start_time" length="29" />
</property>
startTime的类型是postgres中没有时区的时间戳。 因此,当我们保存时,它会再次以UTC格式转换它。
答案 0 :(得分:1)
以毫秒为单位的时间与时区无关。
以毫秒为单位的时间是准确的时间点,无论您在Calendar,Date还是Timestamp对象中使用它的位置。
请仔细阅读Java文档。它表示始终从epoch(1/1/1970 00:00:00 UTC)传递的毫秒数。
仅当从这些对象使用其他表示时,时区才有效。例如从toString()方法,从Calendar等获取字段。)
<强>更新强>
假设您的时间为千分之一1528371250000L
...
那么你可以有两个日历(它们是TimeZone识别的),一个是UTC,一个是东方
请参阅完整的代码示例,以说明在两者中以毫秒为单位同时设置的内容:
public static void main(String... args) throws Exception {
Calendar utcCalendar = Calendar
.getInstance(TimeZone.getTimeZone("UTC"));
utcCalendar.setTimeInMillis(1528371250000L);
System.out.println("UTC Calendar: \t\t" + (utcCalendar.get(Calendar.MONTH) +1)
+ "/" + utcCalendar.get(Calendar.DAY_OF_MONTH) + "/"
+ utcCalendar.get(Calendar.YEAR) + " "
+ utcCalendar.get(Calendar.HOUR_OF_DAY) + ":"
+ utcCalendar.get(Calendar.MINUTE) + ":"
+ utcCalendar.get(Calendar.SECOND) + " " + utcCalendar.getTimeZone().getID());
Calendar eastCalendar = Calendar.getInstance(TimeZone
.getTimeZone("EST"));
eastCalendar.setTimeInMillis(1528371250000L);
System.out.println("Eastern Calendar: \t"
+ (eastCalendar.get(Calendar.MONTH)+1) + "/"
+ eastCalendar.get(Calendar.DAY_OF_MONTH) + "/"
+ eastCalendar.get(Calendar.YEAR) + " "
+ eastCalendar.get(Calendar.HOUR_OF_DAY) + ":"
+ eastCalendar.get(Calendar.MINUTE) + ":"
+ eastCalendar.get(Calendar.SECOND) + " " + eastCalendar.getTimeZone().getID());
XMLGregorianCalendar xmlUtcCalendar = DatatypeFactory.newInstance()
.newXMLGregorianCalendar((GregorianCalendar) utcCalendar);
System.out.println("XML UTC Calendar: \t" + xmlUtcCalendar.toString());
XMLGregorianCalendar xmlEastCalendar = DatatypeFactory.newInstance()
.newXMLGregorianCalendar((GregorianCalendar) eastCalendar);
System.out.println("XML Eastern Calendar: \t" + xmlEastCalendar.toString());
}
输出:
UTC Calendar: 6/7/2018 11:34:10 UTC
Eastern Calendar: 6/7/2018 6:34:10 EST
XML UTC Calendar: 2018-06-07T11:34:10.000Z
XML Eastern Calendar: 2018-06-07T06:34:10.000-05:00