当前位置: 首页 > 面试题库 >

java.sql.Timestamp时区特定吗?

袁阿苏
2023-03-14
问题内容

我必须将UTC dateTime存储在DB中。
我已将特定时区中给定的dateTime转换为UTC。为此,我遵循以下代码。
我输入的日期时间为“ 20121225 10:00:00 Z”,时区为“ Asia / Calcutta”。
我的服务器/数据库(oracle)在同一时区(IST)“ Asia / Calcutta”中运行

获取此特定时区中的Date对象

        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()));

存入数据库

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

输出值

DB(oracle)将给定的存储dateTime: "20121225 10:00:00在UTC中。

我已经从下面的sql中确认了。

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

我的数据库服务器也在同一时区“ Asia / Calcutta”上运行

它给了我以下外观

  1. Date.getTime() 不在UTC
  2. 或在存储到数据库中时,时间戳对时区有影响?我在这里做错了什么?

还有一个问题:

timeStamp.toString()像当地时区一样打印java.util.date吗?不是UTC?


问题答案:

尽管未明确为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驱动程序进行调用时,将使用虚拟机的时区来计算该时区中时间戳的日期和时间。此日期和时间就是存储在数据库中的日期和时间,如果数据库列未存储时区信息,则有关该时区的所有信息都会丢失(这取决于使用数据库的应用程序是否可以使用时区信息)。一致的时区或提出另一种方案来识别时区(即存储在单独的列中)。

例如:你的当地时区是GMT + 2。你存储“ 2012-12-25 10:00:00 UTC”。存储在数据库中的实际值为“ 2012-12-25 12:00:00”。你再次检索它:你以“ 2012-12-25 10:00:00 UTC”再次获得它(但仅当使用检索时才如此getTimestamp(..)),但是当另一个应用程序在时区GMT + 0访问数据库时,它将检索时间戳为“ 2012-12-25 12:00: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);

与JDBC 4.2兼容的驱动程序应该支持java.time.LocalDateTime(和java.time.LocalTime)为TIMESTAMP(和TIME)通过get/set/updateObject。这些java.time.Local*类没有时区,因此不需要应用任何转换(尽管如果你的代码确实采用了特定的时区,则可能会带来一系列新的问题)。



 类似资料:
  • 问题内容: 我正在使用JavaScript类,并尝试使用方法获取当前日期。但显然是加载系统日期和时间。我正在从印度运行代码,但我想使用相同的方法来获取英国的日期和时间。我怎样才能做到这一点? 问题答案: 如果您知道UTC偏移量,则可以使用以下函数传递它并获取时间:

  • 我有一个日期。它是如何存储在数据库中的。我正在使用并调用此函数。 在这里,我知道我的

  • 我有当前的毫秒utc/unix时间,现在我想将其转换为特定时区的日期时间,例如EST utc-5(纽约)。 我使用以下方法获得当前的毫秒/ unix时间: 现在我想把这个长值转换成一个特定的时区。 我如何使用 Joda time 做到这一点,因为我听说这是最好的库,但 API 对我来说似乎有点混乱。

  • 问题内容: public static void main(String[] args) { 它打印: 如何与SQL同时保存SQL ?我需要能够从任何地方获取信息,并将其转换为世界那部分的任何时间。问题在于,它与我的系统时钟设置的时间保持相同的时间。 问题答案: 最好从a 获取而不是从a获取。 第一步是将您的并将其转换为GMT: 然后,您可以通过将其转换为:

  • 问题内容: 如何获取我的python脚本,以检查是否现在使用DST将特定时区存储在变量中?我的服务器设置为UTC。所以我说例如 我想运行有关现在是否正在使用DST的查询,并让返回的结果为true或false。 问题答案: 替代方法是使用: 可以具有以下三个值之一:没有DST,没有DST和未设置时区。

  • 我只使用javascript(不允许使用任何第三方js),并且我想检索UTC+7格式的当前日期时间,格式如下例如: