RedBeanPHP - R::isoDateTime() - 如何设置时区?
Posted
技术标签:
【中文标题】RedBeanPHP - R::isoDateTime() - 如何设置时区?【英文标题】:RedBeanPHP - R::isoDateTime() - How to set timezone? 【发布时间】:2017-05-04 13:54:17 【问题描述】:RedBeanphp ORM 中有一个方便的函数来计算日期。
$time = R::isoDateTime();
如何设置时区?
默认函数不返回运行RB的机器的时间。
【问题讨论】:
【参考方案1】:从阅读the source code 看来,R::isoDateTime()
只是一种方便的方法。它只是调用 PHP time()
函数,然后使用 date
函数将结果格式化为字符串。
我没有测试它,但理论上 - date_default_timezone_set
函数应该可以工作。例如:
date_default_timezone_set('America/Los_Angeles');
【讨论】:
是的。我使用 date_default_timezone_set【参考方案2】:正如马特所指出的,R::isoDateTime()
只是一个便利功能。
在我检查过的所有版本的 RedBean(3.x、4.x)中,它被定义为:
@date( 'Y-m-d H:i:s', $time )`
即:没有任何时区信息的时间戳。例如:2017-09-05 18:49:16.
在 MySQL 下:
您可能正在使用没有任何时区信息的datetime
,而R::isoDateTime()
就可以了。
但使用 Postgres 时要注意:
Postgres 会理解这样的时间,没有时区,就像 Postgres 的时区中的时间(不是 PHP 的!)所以即使你使用 RedBean 设置时间,你可能会发现日期不是你期望的那样。
这应该会有所帮助:
查看 Postgres 的默认时区:SHOW timezone;
。
要更改 Postgres 角色(用户)的默认时区:ALTER ROLE myuser SET timezone = 'Europe/Paris';
。
我建议将 Postgres 的默认时区设置为您想要的 - 为了安全起见。但是,最好在使用时间时明确指出时区。这将避免您的时间在您打算将其置于特定时区时意外地被解释为 UTC。因此,您可能想要使用@date( 'c' )
之类的东西,而不是无时区的R::isoDateTime()
,例如:2017-09-05T18:49:16+02:00。
最后请记住,Postgres 将所有内容存储为 UTC,但可以/将根据其当前设置的 timezone
设置在各种时区显示其 timestamp without a time zone
类型(AKA timestamptz
)。例如:如果设置了欧洲/巴黎,则为 2017-09-05T18:49:16+02:00,但如果设置了 UTC,则为 2017-09-05T16:49:16+00:00(两者指的是同一时间。)
(我喜欢 RedBean,但在任何地方都没有看到这方面的内容。希望这会对某人有所帮助。)
【讨论】:
以上是关于RedBeanPHP - R::isoDateTime() - 如何设置时区?的主要内容,如果未能解决你的问题,请参考以下文章
RedBeanPHP - R::isoDateTime() - 如何设置时区?