我正在处理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)
似乎必须有一种更简单的方法来忽略周围的时区.有任何想法吗?
我有一个类型为 nullable 的列timestamp without time zone。它以以下格式存储在我的 Postgres 数据库中:2021-06-24 11:00:00. 我想将其转换为可为空的timestamp with time zone类型,以便将其显示为2021-06-24 11:00:00.000-00. 请注意,没有时区转换。
该解决方案还应该允许从 转换timestamp with time zone为timestamp without time zone。我做了一些研究,但没有找到任何东西。
我想改进这个慢查询,我想添加一个索引,但我不知道哪种索引类型更适合我的情况。
SELECT COUNT(*) ct FROM events
WHERE dtt AT TIME ZONE 'America/Santiago'
>= date(now() AT TIME ZONE 'America/Santiago') + interval '1s'
Run Code Online (Sandbox Code Playgroud)
查询计划:
"Aggregate (cost=128032.03..128032.04 rows=1 width=0) (actual time=3929.083..3929.083 rows=1 loops=1)"
" -> Seq Scan on events (cost=0.00..125937.68 rows=837742 width=0) (actual time=113.080..3926.972 rows=25849 loops=1)"
" Filter: (timezone('America/Santiago'::text, dtt) >= (date(timezone('America/Santiago'::text, now())) + '00:00:01'::interval))"
" Rows Removed by Filter: 2487386"
"Planning time: 0.179 ms"
"Execution time: 3929.136 ms"
Run Code Online (Sandbox Code Playgroud)
注意:根据 Erwin 的建议,查询运行得更快一些,但我认为还不够快。
"Aggregate (cost=119667.76..119667.77 rows=1 width=0) (actual …Run Code Online (Sandbox Code Playgroud) 如何确保围绕 PostgreSQL 的整个开发环境不会与本地时区混淆。为简单起见,我需要 100% 确定每个时间(戳记)值都是 UTC。当我timestamp without time zone使用该CURRENT_TIMESTAMP函数插入带有(!)的一行时,我不得不意识到情况并非如此,即使我从未指定任何时区信息。
是否有任何分步手册可以帮助我摆脱时区?
我在法国巴黎(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 …
如何将timestampUTC 格式转换为timestamptz?
如果我的本地时区是 GMT-1 并且我运行:
select '2017-01-01 00:00:00'::timestamptz
我得到:
2017-01-01 00:00:00-01
但我想要:
2017-01-01 01:00:00-01
我对重新讨论这个过度讨论的话题犹豫不决,但我创建了一组表来存储数据,其中许多表包括一个名为“createdate”的字段,指定为“没有时区的时间戳”。代码库提供给这些的日期/时间值始终采用 UTC。UI 将能够控制向用户呈现数据的方式,因此某些设置将指示在 UI 中转换为时区。
其中一些时间戳将用于报告,以便为最终用户显示信息。其他时候,这些值将用于确定针对数据运行的夜间作业。
这是一个典型的多租户云托管系统,其客户端跨不同时区。服务器应该永远不会被移动,但我想改变托管区是一个非常遥远的可能性。它是在.net平台上编写的。不使用 noda 时间,只使用内置的 DateTime 内容(目前)。
文档非常清楚时区时间戳如何存储信息:https : //www.postgresql.org/docs/current/datatype-datetime.html
这个答案对两种主要时间戳数据类型的差异也有很好的背景:https : //stackoverflow.com/a/14616640/1905693
这个答案也有一些很好的信息,但面向 Java: 使用 Java 在 PostgreSQL 中存储时间的最推荐方法是什么?
Josh Berkus 有一篇过时的文章很有帮助:https ://it.toolbox.com/blogs/josh-berkus/zone-of-misunderstanding-092811
似乎其中大多数都推荐带时区的时间戳,但就我而言,没有时区的时间戳是否合适?
如果我确实想依靠 pg 进行转换,那么 AT TIME ZONE 子句可以吗?
从整体系统架构来看,依靠 UI 来改变呈现方式是一种常见且合理的方法吗?(是的,这个对于 SO 的格式来说可能过于主观了)
转换类型列后是否可以获得正确的 TZ 缩写timestamptz?
我是什么之后,SOF例子,是为了显示“2016年6月16日16:00-04:00”,在“美国/太平洋”时区与目标TZ缩写。我可以很容易地得到这个:
06/16/2016 01:00 pm
Run Code Online (Sandbox Code Playgroud)
但我无法获得以下信息:
06/16/2016 01:00 pm PDT
Run Code Online (Sandbox Code Playgroud)
一旦转换,timestamptz就变成timestamp without timezone,to_char说明符 'TZ' 变得毫无意义......
这是我尝试过的示例:
SELECT
scheduled_dt AS scheduled_dt
, to_char(scheduled_dt, 'TZ') AS scheduled_dt_orig_tz
-- correct value, but missing TZ
, timezone('US/Pacific', scheduled_dt) AS schedules_dt_converted_tz
, to_char(timezone('US/Pacific', scheduled_dt), 'MM/DD/YYYY HH:MI pm') AS scheduled_dt_converted_tz_localized
-- after conversion TZ is lost
, to_char(timezone('US/Pacific', scheduled_dt), 'MM/DD/YYYY HH:MI pm TZ') AS scheduled_dt_converted_tz_localized_missing_tz
-- with cast, wrong TZ is displayed …Run Code Online (Sandbox Code Playgroud) 我在PostgreSQL中有一个表:
CREATE TABLE tableA
(
time_A time with timezone
);
Run Code Online (Sandbox Code Playgroud)
如何获得now()和之间的分钟差异time_A?