将时区设置为UTC,已经是UTC

时间:2018-06-05 12:04:21

标签: java postgresql date xmlgregoriancalendar

我有应用程序,我已将时区设置为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格式转换它。

1 个答案:

答案 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