时间戳时区是特定的吗?

时间戳时区是特定的吗?

我必须将UTC dateTime存储在DB中。
我已经将特定时区中给定的日期时间转换为UTC。为此,我遵循了以下代码。
我的输入日期是“20121225 10:00 Z”时区是“亚洲/加尔各答”
MyServer/DB(Oracle)运行在同一时区(IST)“Asia/Calcutta”

在这个特定的时区中获取日期对象

        String date = "20121225 10:00:00 Z";
        String timeZoneId = "Asia/Calcutta";
        TimeZone timeZone = TimeZone.getTimeZone(timeZoneId);

        DateFormat dateFormatLocal = new SimpleDateFormat("yyyyMMdd HH:mm:ss z");
                    //This date object is given time and given timezone
        java.util.Date parsedDate = dateFormatLocal.parse(date + " "  
                         + timeZone.getDisplayName(false, TimeZone.SHORT));

        if (timeZone.inDaylightTime(parsedDate)) {
            // We need to re-parse because we don't know if the date
            // is DST until it is parsed...
            parsedDate = dateFormatLocal.parse(date + " "
                    + timeZone.getDisplayName(true, TimeZone.SHORT));
        }

       //assigning to the java.sql.TimeStamp instace variable
        obj.setTsSchedStartTime(new java.sql.Timestamp(parsedDate.getTime()));

存储到DB中

        if (tsSchedStartTime != null) {
            stmt.setTimestamp(11, tsSchedStartTime);
        } else {
            stmt.setNull(11, java.sql.Types.DATE);
        }

输出量

DB(Oracle)存储了相同的给定dateTime: "20121225 10:00:00不是在世界协调时。

我已经从下面的SQL中确认了这一点。

     select to_char(sched_start_time, 'yyyy/mm/dd hh24:mi:ss') from myTable

我的DB服务器也运行在同一时区“Asia/Calcutta”上。

它给了我以下的表象

  1. Date.getTime()

    不在世界协调时
  2. 或者时间戳在存储到DB时有时区影响,我在这里做错了什么?

还有一个问题:

将要timeStamp.toString()在本地时区打印,如java.util.date有吗?不是UTC?


胡说叔叔
浏览 1629回答 3
3回答

紫衣仙女

虽然没有显式地为setTimestamp(int parameterIndex, Timestamp x)司机必须遵守setTimestamp(int parameterIndex, Timestamp x, Calendar cal)javadoc:将指定的参数设置为java.sql.Timestamp值,使用给定的Calendar对象。驱动程序使用Calendar对象来构造sql。TIMESTAMP值,然后驱动程序将其发送到数据库。带着Calendar对象时,驱动程序可以在考虑自定义时区的情况下计算时间戳。如果没有Calendar对象时,驱动程序使用默认时区,即运行应用程序的虚拟机的时区。当你打电话给setTimestamp(int parameterIndex, Timestamp x)JDBC驱动程序使用虚拟机的时区计算该时区中时间戳的日期和时间。这个日期和时间是存储在数据库中的内容,如果数据库列没有存储时区信息,那么有关该区域的任何信息都会丢失(这意味着由应用程序使用数据库一致地使用相同的时区,或者想出另一种方案来识别时区(即存储在单独的列中)。例如:您的本地时区是格林尼治标准时间+2,存储“2012-12-25 10:00:00协调世界时”。存储在数据库中的实际值是“2012-12-25 12:00:00”。您再次检索它:以“2012-12-25 10:00:00协调世界时”的形式再次取回它(但前提是您必须使用getTimestamp(..)),但是当另一个应用程序访问时区GMT+0中的数据库时,它将检索时间戳为“2012-12-2512:00 UTC”。如果要将其存储在不同的时区,则需要使用setTimestamp(int parameterIndex, Timestamp x, Calendar cal)使用所需时区中的Calendar实例。只需确保在检索值时也使用具有相同时区的等效getter(如果使用TIMESTAMP在数据库中没有时区信息)。因此,假设您想要存储实际的GMT时区,则需要使用:Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));stmt.setTimestamp(11, tsSchedStartTime, cal);使用JDBC4.2,兼容的驱动程序应该支持java.time.LocalDateTime(和java.time.LocalTime)TIMESTAMP(和TIME)通过get/set/updateObject..这个java.time.Local*类没有时区,因此不需要应用转换(尽管如果代码确实假定了特定的时区,这可能会打开一组新的问题)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java