【发布时间】:2011-02-01 06:03:59
【问题描述】:
如何获取存储的日期,例如 2011-01-30 18:23:49,并将其调整为任何选择的时区?是否有一种简单的方法,例如通过缩写或添加/减去 x 小时数来简单地定义时区? 基本上我希望用户能够选择他们的时区,并调整这个默认日期以适应他们的时间。
【问题讨论】:
如何获取存储的日期,例如 2011-01-30 18:23:49,并将其调整为任何选择的时区?是否有一种简单的方法,例如通过缩写或添加/减去 x 小时数来简单地定义时区? 基本上我希望用户能够选择他们的时区,并调整这个默认日期以适应他们的时间。
【问题讨论】:
让用户选择他们的时区
使用该区域名称或偏移量与date_default_timezone_set 设置在脚本执行的其余部分中日期函数中使用的默认时区。
使用date('Z') 以秒为单位获取该时区与GMT 的偏移量
将您存储的日期转换为带有strtotime 的时间戳——UNIX 时间戳始终为格林威治标准时间,因此您现在可以使用格林威治标准时间。
添加第 3 步的偏移量以将该时间转换为用户的时区。
再次使用date 将时间戳格式化为所需显示格式的字符串。
例子:
$user_timezone = 'America/Los_Angeles';
$stored_time = '2011-01-30 18:23:49';
date_default_timezone_set($user_timezone);
$timestamp = strtotime($stored_time);
$local_timestamp = $timestamp + date('Z');
$local_date = date('Y-m-d H:i:s', $local_timestamp);
echo $local_date;
【讨论】:
我的解决方案来了。我用 America/Los_Angeles 作为服务器时区,我的时区作为用户对其进行了测试。我假设时间是使用服务器时区存储的。
<?php
// My (user) timezone
$user_timezone = 'Europe/Berlin';
// Server timezone
$stored_timezone = 'America/Los_Angeles';
// Date/Time stored in your DB, using timezone of the server (yours, that is)
$stored_datetime = '2011-01-29 22:40:00'; // this is the current time in L.A.
// Setting default to servers timezone if not done before
date_default_timezone_set($stored_timezone);
// converting to unix timestamp
$stored_timestamp = strtotime($stored_datetime);
// setting default to users timezone
date_default_timezone_set($user_timezone);
// converting to timestamp
$user_datetime = date('Y-m-d H:i:s', $stored_timestamp);
// setting default back to servers timezone
date_default_timezone_set($stored_timezone);
echo $user_datetime; // output is my current time
【讨论】: