- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我必须将 UTC 日期时间存储在数据库中。
我已将特定时区中给出的日期时间转换为 UTC。为此,我遵循了以下代码。
我输入的日期时间是“20121225 10:00:00 Z”时区是“亚洲/加尔各答”
我的服务器/数据库(oracle)在同一时区(IST)“亚洲/加尔各答”运行
获取该特定时区的日期对象
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);
}
输出
数据库(oracle)已存储相同的给定日期时间:“20121225 10:00:00
,而不是UTC。
我已经从下面的sql中确认了。
select to_char(sched_start_time, 'yyyy/mm/dd hh24:mi:ss') from myTable
我的数据库服务器也在同一时区“亚洲/加尔各答”上运行
它给了我以下外观
Date.getTime()
不是 UTC 还有一个问题:
timeStamp.toString()
会像 java.util.date
那样以本地时区打印吗?不是世界标准时间?
最佳答案
虽然没有明确指定 setTimestamp(int parameterIndex, Timestamp x)
驱动程序必须遵循 setTimestamp(int parameterIndex, Timestamp x, Calendar cal)
javadoc 建立的规则:
Sets the designated parameter to the given
java.sql.Timestamp
value, using the givenCalendar
object. The driver uses theCalendar
object to construct an SQLTIMESTAMP
value, which the driver then sends to the database. With aCalendar
object, the driver can calculate the timestamp taking into account a custom time zone. If noCalendar
object is specified, the driver uses the default time zone, which is that of the virtual machine running the application.
当您使用 setTimestamp(intparameterIndex, 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(intparameterIndex, 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*
类没有时区,因此不需要应用转换(尽管如果您的代码确实假设了特定时区,这可能会带来一系列新问题)。
即:
getDate(..)
替换为 getObject(.., LocalDate.class)
setDate(.., dateValue)
替换为 setObject(.., localDateValue)
getTime(..)
替换为 getObject(.., LocalTime.class)
setTime(.., timeValue)
替换为 setObject(.., localTimeValue)
getTimestamp(..)
替换为 getObject(.., LocalDateTime.class)
setTimestamp(.., timestampValue)
替换为 setObject(.., localDateTimeValue)
关于java - java.sql.Timestamp 时区是否特定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62296586/
标题基本上说明了一切。 我主要对更新案例感兴趣。假设我们正在尝试更新具有时间戳记字段的记录,并且我们希望将该字段设置为记录更新的时间戳记。有没有办法做到这一点? 最佳答案 经过一些实验,我找到了合适的
我正在学习一门类(class),其中我必须将日期转换为 unix 时间戳。 import pandas as pd df = pd.read_csv('file.csv') print type(df
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
我在两个不同的数据库中运行了相同的语句:我的本地数据库和 Oracle Live SQL . CREATE TABLE test( timestamp TIMESTAMP DEFAULT SY
bson.timestamp.Timestamp需要两个参数:time 和 inc。 time 显然是存储在 Timestamp 中的时间值。 什么是公司?它被描述为递增计数器,但它有什么用途呢?它应
2016-08-18 04:52:14 是我从数据库中获取的时间戳,用于跟踪我想从哪里加载更多记录,这些记录小于该时间 这是代码 foreach($explode as $stat){
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我想将 erlang:timestamp() 的结果转换为正常的日期类型,公历类型。 普通日期类型表示“日-月-年,时:分:秒”。 ExampleTime = erlang:timeStamp(),
我是 Java 新手。我正在使用两个 Timestamp 对象 dateFrom和dateTo 。我想检查是否dateFrom比 dateTo早 45 天。我用这个代码片段来比较这个 if(dateF
在将 panda 对象转换为时间戳时,我遇到了这个奇怪的问题。 Train['date'] 值类似于 01/05/2014,我正在尝试将其转换为 linuxtimestamp。 我的代码: Train
我正在努力让我的代码运行。时间戳似乎有问题。您对我如何更改代码有什么建议吗?我看到之前有人问过这个问题,但没能成功。 这是我在运行代码时遇到的错误:'Timestamp' object has no
我正在尝试运行以下查询: SELECT startDate FROM tests WHERE startDate BETWEEN TIMESTAMP '1555248497'
我正在使用 Athena 查询以 bigInt 格式存储的日期。我想将其转换为友好的时间戳。 我试过了: from_unixtime(timestamp DIV 1000) AS readab
最近进行了一些数据库更改,并且 hibernate 映射出现了一些困惑。 hibernate 映射: ...other fields 成员模型对象: public class Mem
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
rng = pd.date_range('2016-02-07', periods=7, freq='D') print(rng[0].day) print(rng[0].month) 7 2 我想要
我必须在我的数据库中保存 ServerValue.TIMESTAMP 但它必须是一个字符串。当我键入 String.valueOf(ServerValue.TIMESTAMP); 或 ServerVa
在我的程序中,每个表都有一列 last_modified: last_modified int8 DEFAULT (date_part('epoch'::text, now()::timestamp)
我想将此时间戳对象转换为日期时间此对象是在数据帧上使用 asfreq 后获得的这是最后一个索引 Timestamp('2018-12-01 00:00:00', freq='MS') 想要的输出 2
我有一个包含时间序列传感器数据的大表。大型是指分布在被监控的各个 channel 中的从几千到 10M 的记录。对于某种传感器类型,我需要计算当前读数和上一个读数之间的时间间隔,即找到当前读数之前的最
我是一名优秀的程序员,十分优秀!