php - 将用户指定的日期和时间(使用 mktime 转换)调整为特定时区

标签 php date time timezone

我已经为此摸不着头脑几个小时了,决定寻求一些帮助。

我正在使用 JavaScript 日历来允许用户选择日期和时间。现在我希望这个时间相对于他们的时区(我已经记录在数据库中)。但是我无法理解如何存储输入。我知道我需要调整 mktime 将输出到用户时区的 UTC 时间戳,但我遇到了问题。

这是我尝试过的:

$time = $_POST['datetime']; // Dont worry I will sanitize the input
echo $time.'<br>';
$timezone = "Canada/Pacific"; // Just an example, this will be taken from the database
$timestamp = mktime($hours, $minute, 0, $month, $day, $year); // Based on $time, I just ignored my steps to get the hours etc here
date_default_timezone_set($timezone);
echo 'Your timezone: '.date("F j Y h:i:s A", $timestamp).'<br />';
date_default_timezone_set('UTC');
echo 'UTC: '.date("F j Y h:i:s A", $timestamp);

当我执行上述操作时,我得到的输出是:

30 October 2013 - 01:00 AM
Your timezone: October 29 2013 11:00:00 PM
UTC: October, 30 2013 06:00:00 AM

问题是,虽然用户输入 1:00 AM,但我期望 mktime 将其转换为 1:00 的 UTC 时间戳,但它似乎被转换为 UTC 时间戳,而实际上是 6:00是。我无法弄清楚 5 小时差异从何而来,而且我不想在那里编写静态 5 小时差异代码。

修复之后,我想将时间戳保存为已调整的 UTC 时间戳,这样如果我将来要获取时间戳并执行以下操作:

$timezone = "Canada/Pacific";
date_default_timezone_set($timezone);
echo 'Time: '.date("F j Y h:i:s A", $timestamp); // $timestamp from the database

它应该输出:

30 October 2013 - 01:00 AM

感谢任何帮助!

最佳答案

使用DateTimeDateTimezone ,您的生活将会更加轻松。

如果发布的日期时间是 UTC,您可以简单地在 UTC 时区创建 DateTime 对象,如下所示:

$dt = new DateTime($_POST['datetime'], new DateTimezone('UTC'));
echo $dt->format('F j Y h:i:s A P');

如果您想更改用户的时区,您可以在 DateTime 对象上调用 setTimezone():

$dt->setTimezone(new DateTimezone('Canada/Pacific'));
echo $dt->format('F j Y h:i:s A P');

尝试 demo


如果您发布的日期时间类似于 2013 年 10 月 30 日 - 01:00 AM,则您不能使用 new DateTime()strtotime() > 因为它不是标准的日期时间格式。在这种情况下,您可以使用 DateTime::createFromFormat像这样:

$dt = DateTime::createFromFormat('j F Y - h:i A', $_POST['datetime'], new DateTimezone('UTC'));

尝试 demo

关于php - 将用户指定的日期和时间(使用 mktime 转换)调整为特定时区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19956122/

相关文章:

html - Chrome中防止自动占位符输入类型日期的方法

java - 如何正确解析SimpleDateFormat?

mysql - 从 2 个时间戳中过滤日期时间

python - 这是一个什么样的纪元时间

php - 两个不同 SQL 查询的组合和排序结果

PHP - 批量邮件和检查服务器响应

javascript - 为什么PHP可以设置Cookie而不是本地存储

php - 高效的多维数组搜索算法在PHP中的实现

sqlite - 如何在 SQLite 中按季度/3 个月(或任何自定义时间段)分组?

JavaScript 正则表达式 : validate time