【问题标题】:How to convert datetime to GMT in php如何在php中将日期时间转换为GMT
【发布时间】:2011-10-09 22:44:47
【问题描述】:

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

这就是我计划如何转换他们输入的时间。它将以07/21/2011 01:30 am 之类的形式开始,然后,

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(我认为其中之一是格林威治标准时间)

那我该如何转换呢?

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

【问题讨论】:

  • 07/21/2011 01:30 am 几点了?格林威治标准时间?服务器时区是什么?这些信息很重要:)
  • 我不确定您所说的“什么时间是 2011 年 7 月 21 日上午 1 点 30 分”是什么意思,因为这不是现在的时间吗?我的服务器时区是 America/Los_Angeles。
  • 将您的服务器时间设置为 GMT 并使用 date()
  • 你可以参考这个[问题][1] [1]:stackoverflow.com/questions/2095703/php-convert-datetime-to-utc谢谢。
  • 我根据您的 cmets 更新了我的帖子。还是不行。

标签: php datetime date gmt


【解决方案1】:

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

<?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)

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

如果时区不同,您必须对其进行规范化,以便 减法 按预期工作。因此,例如,如果您在数据库中存储 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>

Demo here

【讨论】:

  • “你必须对它们进行规范化才能使减法按预期工作”这就是我的困惑所在。我已经制定了一个功能来显示时差。但它关闭了。因此,我假设我没有将用户输入时间转换为标准化 GMT 的属性。我怎样才能做到这一点?我在上面举了一个例子:echo gmdate('Y-m-d H:i:s',strtotime('07/21/2011 01:30 am'));这就是我对用户输入时间(在他们当地的时区)所做的我如何规范它们?
  • @brybam:我只是重写了我的答案。看看这是否有意义。总之,在减去它们之前,您需要两次具有相同的时区。 strtotime 足够聪明,可以为你做所有的数学运算……只需添加时区后缀。 +0500PSTGMT 等将起作用。
  • 似乎没有将当地时间更改为格林威治标准时间。我更新了上面的问题并解释了我所做的测试
  • Ummm...实际上它正在将GMT时间转换为本地时间...strtotime()如果指定了时区,则将时间转换为本地时间。
  • 我需要它来将本地时间转换为格林威治标准时间。我上面说的是,我在东部标准时间凌晨 3 点给了它,我在上面运行了上面显示的函数,它返回 2011-07-21 03:00:00 EST 而不是让它变成格林威治标准时间......我更新了上面的代码显示了我如何看到它没有转换我的本地时间。
【解决方案2】:

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

date_default_timezone_set('Europe/London');

这将使所有日期函数返回格林威治标准时间的日期,我相信也考虑到 BST。

【讨论】:

  • 感谢您的提示。但我已经有了 date_default_timezone_set("GMT");放。我的问题只是用户输入日期/时间我不知道如何转换它。如果你看我问题的底部,我展示了一个测试和结果。
  • 或许可以看看这篇文章:blog.boxedice.com/2009/03/21/…
【解决方案3】:

您好,我住在波兰,我们有 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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-01
    • 2021-02-08
    • 2020-04-15
    • 2018-04-13
    • 2016-11-12
    • 2019-01-27
    • 1970-01-01
    • 2011-06-27
    相关资源
    最近更新 更多