我正在处理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)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我需要在我的应用程序中使用多个时区.
基本上我的系统生成数据,来自地球上任何地方的客户都可以访问它.
由于我的数据有一个相关的时间戳,我想到了以下处理时区的策略.
在Postgres:
使用::timestamptz我的时间戳的类型创建我的表.没有时区的时间戳不允许混合::timestamp,::timestamptz在我的情况下看起来像一颗定时炸弹.
将我的PG服务器系统的时区设置为UTC.
设置timezone='UTC'在postgresql.conf(可能并不需要,如果系统的TZ是UTC,但我是一个有点偏执,它花了我什么).
创建表时添加以下检查:
CONSTRAINT timestamp_must_be_utc CHECK(date_part('timezone':: text,"my_timestamp_field")= 0 :: double precision)
以UTC格式存储我的所有时间戳
在客户端(python + pytz)
将客户的时区存储在他的个人资料中,例如 'America/Los Angeles'
在查询数据时将时区信息发送到postgres,这样我就能获得类似的东西SELECT xxxx FROM yyyy WHERE my_ts >= '2012-11-27 19:13:00+01'::timestamptz,让Postgres转换为UTC.或者我可以使用pytz进行转换,但似乎Postgres会做得很好.
根据客户的时区转换时间戳,以便我可以正确显示数据+时间戳.
总而言之,我计划在任何地方使用UTC来存储和查询数据,并在显示数据时只使用时区转换.
我对Postgres及其处理时区的方式没有多少经验.我知道处理不同时区的日期和时间是多么困难(一旦你必须使用航班时刻表,你就会学到使用UTC是唯一可行的日期和时间微积分的方法)这就是我要问的原因这个问题让我更有经验的postgres用户可以确认或纠正我的策略.
有趣的链接: