0

好的,所以我不确定我是否将用户输入时间正确转换为 GMT。我将让多个时区的用户输入“事件”,他们必须能够看到当前的“直到多久”或“多久之后”time();

这就是我打算如何转换他们输入的时间。它会像07/21/2011 01:30 amThen 一样开始,

echo gmdate('Y-m-d H:i:s',strtotime('07/21/2011 01:30 am'));

给我2011-07-21 08:30:00

所以我打算取gmdate('Y-m-d H:i:s',strtotime('07/21/2011 01:30 am'));然后取值time()并向用户显示“距离这个事件还有多长时间”。但似乎结果总是增加了 10 小时,所以如果我从现在开始 30 分钟安排一个活动,它会说从现在开始 10 小时 30 分钟。所以,我想我没有正确转换当地时间或其他东西。

我错过了什么?也许我只是没有正确理解格林尼治标准时间。如何确保所涉及的所有时间都是 GMT 时间,以便所有时间对网站上的所有用户都是通用的?

其他信息(如果有帮助):服务器时区是America/Los_Angeles

编辑:在大家的建议之后,我尝试在我的 php 代码顶部设置它:

date_default_timezone_set("GMT");

我试着用date('Y-m-d H:i:s')做比较来找出差异,但它说的是“3 小时前”而不是 10 小时后。所以这肯定改变了事情。

但仍然不正确。

我已确认date('Y-m-d H:i:s')返回正确且当前的 GMT。所以这很好。

但用户输入日期已关闭。我如何错误地转换它?


再次编辑(包括 Salman A 建议后的一些测试结果):

2:55am - 我当前的当地时间 EST

date('Y-m-d H:i:s')显示为2011-07-21 06:56:43- 这是正确的

东部标准时间凌晨 3:00 是我提交的未来时间07/21/2011 03:00 am

这是我如何获得时间“转换”并将其提交到我的数据库:

$time = $_POST['time'];

//there is where im assuming it turns my EST time to the GMT equivalent.
$the_date = strtotime($time . ' GMT');

$utctime = gmdate('Y-m-d H:i:s',$the_date);

我希望我的功能会告诉我该事件是从现在开始的 5 分钟,但它会休息几个小时。

只是为了确保用户提交的时间实际上被转换为 GMT 我显示$utctime并且它显示为 2011-07-21 03:00:00- 这不是 08:00 或 07:00(我认为其中之一将是 GMT 等价的)

那么我该如何转换呢?

所以,我看到的strtotime($time . ' GMT');似乎并没有将格林威治标准时间应用于我提供的当地时间。附带说明:有人建议我date_default_timezone_set("GMT");在我的代码中有,所以我把它放在顶部。我应该删除它吗?但我注意到如果我删除它,格林威治标准时间不正确。所以这就是我离开它的原因。

4

3 回答 3

2

如果您只需要计算两个时间值之间的差异:

<?php
$time = '07/21/2011 11:30 am';
$timeleft = strtotime($time) - time();
// target time....: 2011-07-21 11:30:00 
// current time...: 2011-07-21 11:13:45
// difference.....: 975 seconds (16 min, 15 seconds)

上面的例子假设与函数$time使用的时区相同,time()即服务器的时区。

如果时区不同,您必须对其进行规范化,以使减法按预期工作。因此,例如,如果您GMT在数据库中存储日期/时间,那么上面的示例将变为:

<?php
$time = '07/21/2011 06:30 am';
$timeleft = strtotime($time . ' GMT') - time();
// target time............: 2011-07-21 06:30:00 GMT
// converted local time...: 2011-07-21 11:30:00 PKT
// current time...........: 2011-07-21 11:34:48 PKT
// difference.............: -288 seconds (minus 4 minutes, 48 seconds)

编辑 1

关于这段代码:

$time = $_POST['time'];

如果您的用户来自世界各地,您应该:

  • 要求他们输入格林威治标准时间的日期/时间
  • 要求他们输入输入日期的时区

您可以稍后在服务器端转换日期并将其存储在数据库中:

<?php
$source_time     = '2011-07-21 17:00';
$source_offset   = '-0700'; // PDT
$local_timestamp = strtotime($source_time . ' ' . $source_offset); // 2011-07-22 05:00 PKT (SERVER TIME)
list(
    $temp_hh,
    $temp_mm
)                = explode(':', date('P')); // returns difference between SERVER TIME and GMT
$local_offset    = $temp_hh * 3600 + $temp_mm * 60;
$gmt_timestamp   = $local_timestamp + $local_offset;
echo date("Y-m-d H:i:s", $gmt_timestamp); // 2011-07-21 10:00:00
                                          // THIS is what you store in your database
                                          // Same as 2011-07-21 17:00:00 minus 7 hours

如果没有时区信息,您的计算将不可靠。

编辑#2

实际上......它要简单得多:

<?php
$source_time   = '2011-07-21 17:00';
$source_offset = -7.0; // -0700
echo date("Y-m-d H:i:s", strtotime($source_time) + $source_offset * 3600);
// 2011-07-21 10:00:00
// THIS is what you store in your database

编辑#3

<input type="text" name="time" id="time" value="07/21/2011 17:00">
<input type="text" name="offset" id="offset">
<script type="text/javascript">
    document.getElementById("time").onchange = function(){
    var d = new Date(this.value);
    alert('Date entered: ' + d + '\nDate to GMT: ' + d.toUTCString());
    }
    document.getElementById("offset").value = (new Date()).getTimezoneOffset() / 60;
</script>

演示在这里

于 2011-07-21T05:51:57.333 回答
1

一个好主意是为您的脚本显式设置时区。例如:

date_default_timezone_set('Europe/London');

这将使所有日期函数都返回 GMT 日期,我相信也会考虑 BST。

于 2011-07-21T08:20:01.197 回答
1

您好,我住在波兰,我们有 CET 时间。要将 CET 转换为 GMT,我正在使用函数:

function convertCETtoGMT($timeCET)
    {
        date_default_timezone_set('EUROPE/London');
        $time = $timeCET." CET";
        $timeGMT = date('Y-m-d H:i:s', strtotime($time));
        date_default_timezone_set('EUROPE/Warsaw'); //set back to CET
        return $timeGMT;
    }
于 2019-03-01T11:30:08.903 回答