如何根据用户时区返回时间戳?

时间:2017-01-18 15:47:53

标签: php

假设我有一个从我的用户可以设置为其首选时区的数据库返回的时区变量。 GMT + 5将简单地返回:

$timezone = 5;

我需要用户时区,以便能够以特定的时间格式反映事件的日期。以下是我到目前为止的情况:

while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) {
$time = strftime("%Y-%m-%d %I:%M %p", strtotime($row["time"]));
}
echo $time;

如何根据用户首选时区更改上述输出以反映事件的时间?

//Output = 2017-01-15 12:09 AM 
//Expected Output: 2017-01-14 07:09 PM  

1 个答案:

答案 0 :(得分:2)

使用DateTimeDateTimeZone个对象。

<?php

$storedDate = new DateTime('2017-01-15 12:09 AM');
$userDate   = (clone $storedDate)->setTimeZone(new DateTimeZone('Europe/Paris'));

printf(
    "Stored Date:\t%s\nUser Date:\t%s\n",
    $storedDate->format(DATE_ATOM),
    $userDate->format(DATE_ATOM)
);

// outputs:
// Stored Date:    2017-01-15T00:09:00+00:00                                                                               
// User Date:      2017-01-15T01:09:00+01:00

正如我在评论中所说,我不建议将时区存储为整数。

首先,因为某些时区不能适合整数,例如印度距离UTC时间最长为5:30(+0530)。

存储为整数也不会帮助您在某些国家/地区甚至某个国家/地区(见巴西)正确处理夏令时。

时区偏移可能会发生变化,但是Europe/Paris等给定位置的定义配置可能不会。