我正在处理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正确选择日期时遇到问题 - 它们以UTC格式存储,但未正确转换为Date()函数.
将时间戳转换为日期会给我错误的日期,如果它超过太平洋标准时间下午4点.
2012-06-21应该是2012-06-20这种情况.
该starts_at列数据类型是timestamp without time zone.这是我的疑问:
无需转换为PST时区:
Select starts_at from schedules where id = 40;
starts_at
---------------------
2012-06-21 01:00:00
Run Code Online (Sandbox Code Playgroud)
转换给出了这个:
Select (starts_at at time zone 'pst') from schedules where id = 40;
timezone
------------------------
2012-06-21 02:00:00-07
Run Code Online (Sandbox Code Playgroud)
但是都没有转换为时区中的正确日期.
postgresql timezone datetime rails-postgresql postgresql-9.1
我有一个Postgres 时钟闹钟表(不是真的,但这是类似的,更容易解释).用户以1小时的分辨率设置警报,用户可以来自许多不同的时区.警报每天重复.我想要可靠地获取在一天中的特定时刻应该关闭的警报,并且我遇到夏令时问题.我该如何以最好的方式做到这一点?
阿尔弗雷德和洛塔都住在斯德哥尔摩(从UTC开始+1小时,但在DST时为+ 2小时).
Sharon住在新加坡(距离UTC +8小时,没有夏令时)在冬季,阿尔弗雷德在凌晨4点发出警报.警报应该在当地时间凌晨4点全年开始.
在夏季,Lotta在凌晨5点发出警报.它应该全年都在凌晨5点出发.
与此同时,沙龙已经在上午11点发出警报.所有这些都可以03:00 UTC的形式存储在数据库中.
如果我在冬天查询数据库以获取应在03:00 UTC发出的警报,我想要Alfred和Sharon的警报.新加坡现在离瑞典只有7小时,所以新加坡上午11点在瑞典凌晨4点.洛塔的警报不应该再持续一小时.
相反,如果我在夏天查询数据库以获取应在03:00 UTC发出的警报,我想要Lotta和Sharon的警报.新加坡现在离瑞典只有6小时,所以新加坡上午11点在瑞典上午5点.斯文的闹钟在一小时前响起.
我如何存储它,并查询数据库?
如有必要,我可以更改数据库架构.目前,我们根本没有调整DST,事实上只有一个"小时"整数字段(看似愚蠢,时间字段会更好).
我似乎需要存储UTC时间和时区信息,但我不知道如何在Postgres中最好地实现这一点.我发现Postgres有一些时区概念,但据我所知,没有时区字段类型.此外,我想我需要在SQL中进行一些计算,以确定如何根据时区数据和创建日期来偏移select中的UTC时间.我对SQL不太满意......
我想在Postgres中解决这个问题,因为可能存在很多"警报",我想避免将所有这些问题都引入Ruby并在那里过滤所带来的性能问题.(是的,这是一个Rails应用程序.)
我只是花了一个小时绝望,这两个表达式的结果有差异:
db=# SELECT '2012-01-18 1:0 CET'::timestamptz AT TIME ZONE 'UTC'
,'2012-01-18 1:0 Europe/Vienna'::timestamptz AT TIME ZONE 'UTC';
timezone | timezone
---------------------+---------------------
2012-08-18 00:00:00 | 2012-08-17 23:00:00
Run Code Online (Sandbox Code Playgroud)
显然,第二个表达式根据DST规则扣除两个小时,其中第一个表达式仅使用标准偏移量.
我检查了这两个时区名称的目录.他们都在那里,看起来一样:
db=# SELECT * FROM pg_timezone_names WHERE name IN ('CET', 'Europe/Vienna');
name | abbrev | utc_offset | is_dst
---------------+--------+------------+--------
Europe/Vienna | CEST | 02:00:00 | t
CET | CEST | 02:00:00 | t
Run Code Online (Sandbox Code Playgroud)
我查阅了关于时区的PostgreSQL手册:
PostgreSQL允许您以三种不同的形式指定时区:
全时区名称,例如America/New_York.识别的时区名称列在pg_timezone_names视图中(参见第45.67节).PostgreSQL为此目的使用广泛使用的zoneinfo时区数据,因此许多其他软件也识别相同的名称.
时区缩写,例如PST.这样的规范仅定义了与UTC的特定偏移,而不是全时区名称,其也可以暗示一组夏令时转换日期规则.公认的缩写列在pg_timezone_abbrevs视图中(参见第45.66节).您不能将配置参数timezone或log_timezone设置为时区缩写,但可以在日期/时间输入值和AT TIME ZONE运算符中使用缩写.
大胆的重点我的.
为什么差异呢?
关于Debian …
关于在数据库中存储星期和时间的问题,我有两个部分的问题.我正在使用Rails 4.0,Ruby 2.0.0和Postgres.
我有某些事件,这些事件都有一个时间表.例如,对于"Skydiving"活动,我可能有周二,周三和下午3点.
wdayTime类的方法.任何建议都会非常有用.