【问题标题】:Timezone helper for CakePHPCakePHP 的时区助手
【发布时间】:2013-04-03 15:04:19
【问题描述】:

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

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

当用户登录应用程序时,我会保存他们登录的日期/时间,以便出于安全原因向用户显示日志列表。例如$this->User->saveField('lastlogin', date('Y-m-d 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.) 这是处理这个问题的好方法吗?因为这意味着我必须用这个 sn-p 替换所有 date() 调用来获得用户时间。

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

我是否应该改为保存服务器时间,然后使用上面的 sn-p 以不同的方式向用户显示它,所以所有时间都是相同的时区,然后相对于用户显示? p>

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

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

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

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

    Notice: Undefined property: DateTime::$date
    

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

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

    【讨论】:

    • 很酷,解决了第一个问题。对接下来的两个问题有什么想法吗?
    猜你喜欢
    • 2010-12-19
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多