2012-07-10 81 views
2

我在MySQL DATETIME字段中存储UTC时区的时间。 我想将所有这些(在PHP中使用它们时)转换为用户定义的时区。 我知道我可以用php DateTime :: setTimezone来做到这一点,但它需要为每个人做它们。使用用户时区的MySQL和PHP

是否有一些全球性的方式来告诉PHP,所有来自mysql的日期时间是UTC并将它们自动转换为用户时区?

+0

我最近问这些问题。请参阅['this one'](http://stackoverflow.com/questions/11137425/datetimediff-isnt-affected-by-timezone-but-always-return-same-value)和['more'](http:/ /stackoverflow.com/users/155861/diecho?tab=questions) – diEcho 2012-07-10 12:18:58

+0

在我的答案中增加了一个PHP函数,它可以将UTC时间解析为用户时间。只需从数据库中获取数据即可调用它。 – Fluffeh 2012-07-10 13:24:12

回答

3

将它们存储到数据库中时,将表列存储为unix时间戳。这些都是UTC。然后只需应用任何用户指定的偏移量就可以了

这是一个有趣的StackOverflow question这可能会帮助你。

您还可以使用MySQL Unix_Timestamp function在比较时通过生成正确的int来轻松查询数据。

编辑: 如果您确定要在每次使用数据库时转换数据库中的所有日期时间,只需编写一个简单的函数来获取日期时间并为用户添加正确的偏移量,然后只需调用该函数即可每次从数据库中获取日期时间都会起作用。像下面的代码:

<?php 

    // Assuming that $_SESSION['UserOffset'] is storing the user's timezone eg 
    // $_SESSION['UserOffset'] = new DateTimeZone("Europe/Prague"); 

    function convert_time_zone($timeFromDatabase_time) 
    { 
     $userTime = new DateTime($timeFromDatabase, new DateTimeZone('UTC')); 
     $userTime->setTimezone(new DateTimeZone($_SESSION['UserOffset'])); 
     return $userTime->format('Y-m-d H:i:s'); 
     // or return $userTime; // if you want to return a DateTime object. 
    } 


?> 
+0

如果我想使用datetime列(它对时间戳有一些好处)会怎么样? – 2012-07-10 12:20:58

+0

这也需要在每次调用时完成,因此与使用'DateTime()'对象相比,工作量并不少。此外,时间戳不是[GMT](http://en.wikipedia.org/wiki/Gmt),而是[UTC](http://en.wikipedia.org/wiki/Coordinated_Universal_Time)。此外,时间戳无法存储历史日期,调试更困难,因为大多数人无法读取正常日期/时间标记的时间戳。 – feeela 2012-07-10 12:21:46

+0

感谢Feeela,纠正了显示UTC,而不是GMT。 – Fluffeh 2012-07-10 12:24:19