3

我已经使用 Stack Overflow 上的各种示例为我的 CakePHP 应用程序构建了一个简单的时区助手,它将用户区域保存在他们的用户记录中。例如欧洲/伦敦。

查看助手: http: //pastebin.com/VGivwqHJ

当用户登录应用程序时,我会保存他们登录的日期/时间,以便出于安全原因向用户显示日志列表。例如 $this->User->saveField('lastlogin', date('Ymd H:i:s'));

但是,该日期当前将拉取服务器日期/时间。如何利用用户的时区来修改它?

我试过:

$date = new DateTime(null, new DateTimeZone($user['User']['timezone']));

然后:$this->User->saveField('lastlogin', $date->date);但我只是得到空......

但是,如果我调试 $date 我会得到例如:

object(DateTime) {
    date => '2013-04-01 15:22:32'
    timezone_type => (int) 3
    timezone => 'Europe/London'
}

1.)我做错了什么?如何从对象中提取日期时间?

2.) 这是处理这个问题的好方法吗?因为这意味着我必须date()用这个片段替换所有调用来获得用户的时间。

3.)网站上的日期不会不匹配,例如,如果欧洲用户在美国用户之后发布了一些内容,但由于使用了他们的当地时间,它会显示为不同,可能看起来好像在美国之前对方。

我应该改为保存服务器时间,然后使用上面的代码段以不同的方式向用户显示它,所以所有时间都是相同的时区,但随后相对于用户显示?

4

1 回答 1

2

我不确定您是否可以DateTime使用saveField(). 您可能必须将其转换为 CakePHP 认为通用的格式的字符串:

$this->User->saveField('lastlogin', $date->format('Y-m-d H:i:s'))

您的原始代码可能会触发此通知:

Notice: Undefined property: DateTime::$date

...因为DateTime类中没有date公共属性。

关于您的其他问题,正如您已经指出的那样,您显然无法比较属于不同时区的当地时间,就像您无法将公里与英里进行比较一样。如果您存储当地时间,则还需要存储时区并每次都进行转换。因此,将日期标准化并始终使用相同的时区(UTC 或服务器的时区)存储它们并在显示信息时执行转换会更简单。这也更有意义,因为帖子作者的当地时间与其他人无关。

于 2013-04-01T14:47:56.983 回答