我正在处理Rails和Postgres中的日期和时间并遇到这个问题:
数据库采用UTC格式.
用户在Rails应用程序中设置选择的时区,但仅在获取用户本地时间来比较时间时使用.
用户存储时间,例如2012年3月17日晚上7点.我不希望存储时区转换或时区.我只想保存日期和时间.这样,如果用户改变他们的时区,它仍将显示2012年3月17日,晚上7点.
我只使用用户指定的时区来获取用户本地时区当前时间之前或之后的记录.
我目前正在使用"没有时区的时间戳",但是当我检索记录时,rails(?)会将它们转换为应用程序中的时区,这是我不想要的.
Appointment.first.time
=> Fri, 02 Mar 2012 19:00:00 UTC +00:00
Run Code Online (Sandbox Code Playgroud)
因为数据库中的记录似乎是以UTC形式出现的,我的黑客是用当前时间,用'Date.strptime(str,"%m /%d /%Y")删除时区,然后做我的查询:
.where("time >= ?", date_start)
Run Code Online (Sandbox Code Playgroud)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我在法国巴黎(UTC+1或CET).
这是12am(00:00),我们是在2016年11月25日.
我的Postgres数据库托管在该地区的Amazon Web Services(AWS RDS)上eu-west-1.
查询具有特定时区设置的current_date(或current_time)似乎会产生与我的信念不一致的结果.
特别是,current_date在使用CET时区或时区时,查询结果会产生不同的结果UTC+1.
SET TIME ZONE 'UTC+01';
select current_date, current_time;
Run Code Online (Sandbox Code Playgroud)
+------------+--------------------+ | date | timetz | +------------+--------------------+ | 2016-11-24 | 22:00:01.581552-01 | +---------------------------------+
不,那是昨天 - 两个小时前.
SET TIME ZONE 'CET';
select current_date, current_time;
Run Code Online (Sandbox Code Playgroud)
要么
SET TIME ZONE 'Europe/Paris';
select current_date, current_time;
Run Code Online (Sandbox Code Playgroud)
+------------+--------------------+ | date …
我想在 postgresql 中插入时间数据类型,其中包括时区并了解夏令时。这就是我所做的:
CREATE TABLE mytable(
...
start_time time(0) with time zone,
end_time time(0) with time zone
)
INSERT INTO mytable(start_time, end_time)
VALUES(TIME '08:00:00 MST7MDT', TIME '18:00:00 MST7MDT')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
时间类型的输入语法无效:“08:00:00 MST7MDT”
如果我使用“MST”而不是“MST7MDT”,它就可以工作,但我需要它了解夏令时。我还尝试使用“美国/埃德蒙顿”作为时区,但出现了同样的错误。
插入带有时区和 DST 的时间值(不是时间戳)的正确方法是什么?
编辑:我实际上想使用“美国/埃德蒙顿”语法