php将datetime转换为UTC

Jer*_*mey 82 php timezone datetime utc

我需要一种简单的方法将日期时间戳转换为UTC(从服务器所在的任何时区)HOPEFULLY而不使用任何库.

pok*_*oke 101

使用strtotime从给定字符串生成时间戳(解释为本地时间)并使用gmdate将其作为格式化的UTC日期返回.

根据要求,这是一个简单的例子:

echo gmdate('d.m.Y H:i', strtotime('2012-06-28 23:55'));
Run Code Online (Sandbox Code Playgroud)

  • 一个小例子可能吗? (5认同)
  • gmdate()是我希望我很久以前偶然发现的那些PHP函数之一.nl2br,有人吗? (5认同)
  • @cherouvim不认为这是必要的,但无论如何还要添加一个...希望它有所帮助. (2认同)
  • GMT 和 UTC 并不总是相同的。 (2认同)
  • @poke GMT 遵守夏令时,UTC 不遵守,这就是使用它的原因,因此您不必考虑其他任何因素 (2认同)

joe*_*erx 64

使用DateTime:

$given = new DateTime("2014-12-12 14:18:00");
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 14:18:00 Asia/Bangkok

$given->setTimezone(new DateTimeZone("UTC"));
echo $given->format("Y-m-d H:i:s e") . "\n"; // 2014-12-12 07:18:00 UTC
Run Code Online (Sandbox Code Playgroud)

  • DateTime 确实接受时间戳作为输入:`new DateTime('@' . 1656627600)` (2认同)

Phi*_*ord 28

尝试使用getTimezone和setTimezone,请参阅示例

(但这确实使用了一个类)

更新:

没有任何课程你可以尝试这样的事情:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "<br />");
echo(date("Y-d-mTG:i:sz",$the_date) . "<br />");
echo(date_default_timezone_set("UTC") . "<br />");
echo(date("Y-d-mTG:i:sz", $the_date) . "<br />");
Run Code Online (Sandbox Code Playgroud)

注意:您可能还需要将时区设置回原始时区

  • 您应该使用`gmdate`而不是将默认时区更改为UTC.因为`gmdate`自动使用UTC. (48认同)
  • -1因为您不想为此更改全局默认时区.它只是要求出乎意料的副作用. (27认同)
  • 我认为它应该是"Ym-dTG ......"而不是"Yd-mTG ......" (2认同)

Att*_*lio 19

这样做:

gmdate('Y-m-d H:i:s', $timestamp)
Run Code Online (Sandbox Code Playgroud)

或者干脆

gmdate('Y-m-d H:i:s')
Run Code Online (Sandbox Code Playgroud)

在UTC中获得"NOW".

检查参考:

http://www.php.net/manual/en/function.gmdate.php


Joh*_*han 14

如果您的日期格式为YYYY-MM-HH dd:mm:ss,您实际上可以通过在"datetime字符串"末尾添加UTC来欺骗php并使用strtotime进行转换.

date_default_timezone_set('Europe/Stockholm');
print date('Y-m-d H:i:s',strtotime("2009-01-01 12:00"." UTC"))."\n";
print date('Y-m-d H:i:s',strtotime("2009-06-01 12:00"." UTC"))."\n";
Run Code Online (Sandbox Code Playgroud)

这将打印出来:

2009-01-01 13:00:00
2009-06-01 14:00:00
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,它也会解决夏令时问题.

有点奇怪的解决方法.... :)


The*_*lal 9

如果您不介意使用自 PHP 5.2.0 起就可用的 PHP 的DateTime类,那么有几种方案可能适合您的情况:

  1. 如果您有一个$givenDtDateTime 对象要转换为 UTC,那么这会将其转换为 UTC:

    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果$givenDt稍后需要原始对象,您可能还想在转换克隆对象之前克隆给定的 DateTime 对象:

    $utcDt = clone $givenDt;
    $utcDt->setTimezone(new DateTimeZone('UTC'));
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果您只有一个日期时间字符串,例如$givenStr = '2018-12-17 10:47:12',那么您首先创建一个日期时间对象,然后对其进行转换。请注意,这假设$givenStr在 PHP 配置的时区中。

    $utcDt = (new DateTime($givenStr))->setTimezone(new DateTimeZone('UTC'));
    
    Run Code Online (Sandbox Code Playgroud)
  4. 如果给定的日期时间字符串与 PHP 配置中的时区不同,则通过提供正确的时区来创建日期时间对象(请参阅PHP 支持的时区列表)。在这个例子中,我们假设本地时区在阿姆斯特丹:

    $givenDt = new DateTime($givenStr, new DateTimeZone('Europe/Amsterdam'));
    $givenDt->setTimezone(new DateTimeZone('UTC'));
    
    Run Code Online (Sandbox Code Playgroud)


aor*_*sik 5

我有时会使用这种方法:

// It is not importnat what timezone your system is set to.
// Get the UTC offset in seconds:
$offset = date("Z");

// Then subtract if from your original timestamp:
$utc_time = date("Y-m-d H:i:s", strtotime($original_time." -".$offset." Seconds"));
Run Code Online (Sandbox Code Playgroud)

大部分 时间有效。

  • 这里有两个问题。首先你不应该减去你应该添加偏移量。其次,如果本地时区当前处于 DST,而所需日期不在 DST,则此方法不起作用。偏移量将减少一个小时。或相反亦然。所以是的,这在大多数情况下都有效,但并非总是如此。 (3认同)

Fra*_*Hou 5

将本地时区字符串转换为UTC字符串。
例如,新西兰时区

$datetime = "2016-02-01 00:00:01";
$given = new DateTime($datetime, new DateTimeZone("Pacific/Auckland"));
$given->setTimezone(new DateTimeZone("UTC"));
$output = $given->format("Y-m-d H:i:s"); 
echo ($output);
Run Code Online (Sandbox Code Playgroud)
  • NZDT:
    如果$ datetime =“ 2016-02-01 00:00:01”,$ output =“ 2016-01-31 11:00:01”,则UTC + 13:00 ;
    如果$ datetime =“ 2016-02-29 23:59:59”,$ output =“ 2016-02-29 10:59:59”;
  • NZST:
    如果$ datetime =“ 2016-05-01 00:00:01”,$ output =“ 2016-04-30 12:00:01”,则UTC + 12:00 ;
    如果$ datetime =“ 2016-05-31 23:59:59”,$ output =“ 2016-05-31 11:59:59”;

https://zh.wikipedia.org/wiki/Time_in_New_Zealand