【问题标题】:PostgreSQL: SET TIME ZONE formattingPostgreSQL:设置时区格式
【发布时间】:2014-10-29 11:10:21
【问题描述】:

那些给出正确的结果:

SET TIME ZONE '-04';SET TIME ZONE INTERVAL '-04:00';

SELECT current_setting('TIMEZONE'), now();
 current_setting |              now              
-----------------+-------------------------------
 -04:00:00       | 2014-10-29 06:45:35.694796-04

虽然这些是倒置的:

SET TIME ZONE '-04:00';

SELECT current_setting('TIMEZONE'), now();
 current_setting |              now              
-----------------+-------------------------------
 -04:00          | 2014-10-29 14:52:25.322796+04

SET TIME ZONE '-04:00:00';

SELECT current_setting('TIMEZONE'), now();
 current_setting |              now              
-----------------+-------------------------------
 -04:00:00       | 2014-10-29 14:52:33.591539+04

我做错了什么?

【问题讨论】:

  • 我认为这是一个错误。这是因为 POSIX 时区与“正常”时区相反。请通过错误报告表单提出此问题。
  • @CraigRinger 根据下面的答案,你还认为这是一个错误吗?也许至少这种记录在案的行为值得一些改进,比如在没有识别出 POSIX 样式的时区时发出警告,或者在我们想要使用 POSIX 样式时需要明确的格式?
  • 我认为这是一个记录在案的错误 ;-) 。我知道 POSIX 时区处理很丑陋,但没有意识到它是如此丑陋。为此,我们确实需要strict 模式。所以它不是新的,也没有必要报告它,但是......糟糕。
  • @CraigRinger current_setting('TIMEZONE') 怎么样?它没有准确报告内部值,因为在显示-04:00:00 时,这可能意味着内部-04+04SHOW TIMEZONE; 也一样。 documentation 中没有关于此的内容。这是一个错误吗?

标签: postgresql timezone


【解决方案1】:

SET TIME ZONE有3种形式(实际上是4种,有两个特殊值:LOCAL&DEFAULT);它可以接受:

  • 文本中的时区缩写,
  • 数字中的时区偏移量(偏移量实际上以小时为单位),
  • 时间间隔内的时区偏移

另外,需要说明的是,当您提供无效的时区缩写时,SET 语句将 silently accept bogus input

人们应该警惕 POSIX 风格的时区功能可能会导致默默地接受虚假输入,因为没有检查时区缩写的合理性。

检查这个SQLFiddle,在那里你可以看到:

  • SET TIME ZONE '-04' 将时区偏移设置为数字(以小时为单位)
  • SET TIME ZONE '-04:00' 将尝试使用其缩写设置时区,但会静默失败
  • SET TIME ZONE '-04:00:00' 也会尝试设置一个带有其缩写的时区,并且会默默地失败,但你会得到这个语句成功的意图,因为获取当前设置会给你你的假时区缩写,这可以解释为一个也有效(但事实并非如此)。

始终使用直接数字,或 INTERVAL 文字和 SET TIME ZONE,或者最好:使用有效的时区缩写,例如 America/New_York

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    相关资源
    最近更新 更多