0

我有一个应用程序,其中我将时区设置为 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 中设置它的行。

然后在休眠中,我在存储此值的表的 hbm.xml 中有属性-

<property name="startTime" type="timestamp">
            <column name="start_time" length="29" />
        </property>

startTime 的类型是 postgres 中没有时区的时间戳。因此,当我们保存时,它会再次将其转换为 UTC。

4

2 回答 2

1

以毫秒为单位的时间与时区无关。

以毫秒为单位的时间是准确的时间点,无论您在日历、日期或时间戳对象中的什么位置使用它。

请仔细阅读 Java 文档。它始终表示从纪元(1/1/1970 00:00:00 UTC)经过的毫秒数。

只有当从这些对象中使​​用其他表示时,时区才有效。例如从 toString() 方法,从日历中获取字段等)

更新 假设您有以毫秒为单位的时间1528371250000L...

那么你可以有两个日历(他们是时区感知)一个在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
于 2018-06-05T12:53:43.793 回答
1
于 2018-06-06T20:48:18.103 回答