RedBeanPHP - R::isoDateTime() - 如何设置时区?

RedBeanPHP - R::isoDateTime() - How to set timezone?

RedBeanPHP ORM 中有一个方便的函数可以用来设置日期。

$time = R::isoDateTime();

如何设置时区?

默认函数不returnRB 运行开启的机器时间。

从阅读 the source code 看来,R::isoDateTime() 只是一种方便的方法。它只是调用 PHP time() 函数,然后使用 date 函数将结果格式化为字符串。

我没有测试它,但理论上 - date_default_timezone_set 函数应该可以工作。例如:

date_default_timezone_set('America/Los_Angeles');

正如 Matt 指出的那样,R::isoDateTime() 只是一个方便的函数。

在我检查过的所有RedBean版本中(3.x、4.x),它被定义为:

@date( 'Y-m-d H:i:s', $time )`

即:没有任何时区信息的时间戳。例如:2017-09-05 18:49:16.


下MySQL:

您可能正在使用没有任何时区信息的 datetimeR::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,但 can/will 根据其当前设置在各种时区显示其 timestamp without a time zone 类型(又名 timestamptztimezone 设置。例如:如果设置了 Europe/Paris,则为 2017-09-05T18:49:16+02:00,如果设置了 UTC,则为 2017-09-05T16:49:16+00:00(两者指的是同一时间.)

(我喜欢 RedBean,但还没有在任何地方看到它。希望这会对某人有所帮助。)