【发布时间】:2012-01-29 03:25:34
【问题描述】:
如何使用 PHP 的 date() 函数获取 UTC/GMT +/- 时间戳?例如,如果我尝试
date("Y-m-d H:i:s", time());
我会得到 Unix 时间戳;但我需要根据本地时间获取带有字符串 GMT/UTC+/-0400 或 GMT/UTC+/-1000 的 UTC/GMT 时间戳。
【问题讨论】:
如何使用 PHP 的 date() 函数获取 UTC/GMT +/- 时间戳?例如,如果我尝试
date("Y-m-d H:i:s", time());
我会得到 Unix 时间戳;但我需要根据本地时间获取带有字符串 GMT/UTC+/-0400 或 GMT/UTC+/-1000 的 UTC/GMT 时间戳。
【问题讨论】:
使用 gmdate 将始终返回 GMT 日期。语法与date 相同。
【讨论】:
gmdate("U") == time()。)听起来像是潜在的错误行为。仔细检查并提交 PHP 项目的错误。
time() 返回“自 Unix 纪元(1970 年 1 月 1 日 00:00:00 GMT)以来的秒数”。注意GMT。默认情况下,您的系统会将其转换 到您的时区以进行显示,这为用户提供了便利。在内部,它始终是 GMT。
一个简单的gmdate()就足够了
<?php
print gmdate("Y-m-d\TH:i:s\Z");
【讨论】:
作为previously answered here,从PHP 5.2.0 开始,您可以使用DateTime 类并使用DateTimeZone 的实例指定UTC 时区。
DateTime __construct() documentation 建议在创建 DateTime 实例并指定时区以获取当前时间时将“now”作为第一个参数传递。
$date_utc = new \DateTime("now", new \DateTimeZone("UTC"));
echo $date_utc->format(\DateTime::RFC850); # Saturday, 18-Apr-15 03:23:46 UTC
【讨论】:
DateTime 之前的反斜杠是什么用途?自己运行它,没有它们似乎也能正常工作。
namespace A 声明,PHP 将假定DateTime 引用A\DateTime,这是错误的。添加反斜杠可以解决问题。在我看来,即使你还没有使用命名空间,也要养成一个好习惯。
$time = time();
$check = $time+date("Z",$time);
echo strftime("%B %d, %Y @ %H:%M:%S UTC", $check);
【讨论】:
获取 UTC 日期
gmdate("Y-m-d H:i:s");
获取 UTC 时间戳
time();
即使您的代码中有date_default_timezone_set,结果也不会有所不同。
【讨论】:
time() 返回一个整数,而gmdate 返回一个格式化字符串。因此,如果您小心使用它们,它们只是“没有什么不同”。从技术上讲,gmdate 语法与gmdate("Y-m-d H:i:s", time()); 相同,也就是说,默认情况下,格式化的时间是time()。
date("Y-m-d H:i:s", time() - date("Z"))
【讨论】:
除了调用gmdate,您还可以将此代码放在其余代码之前:
<?php
date_default_timezone_set("UTC");
?>
这将使您其余与日期/时间相关的调用使用 GMT/UTC 时区。
【讨论】:
您可以使用不带参数的 gmmktime 函数来获取当前的 UTC 时间戳:
$time = gmmktime();
echo date("Y-m-d H:i:s", $time);
gmmktime 仅在您的服务器时间使用 UTC 时才有效。例如,我的服务器设置为 US/Pacific。上面列出的函数与太平洋时间相呼应。
【讨论】:
使用字符串 GMT/UTC +/-0400 或 GMT/UTC +/-1000,基于本地时间
您的自定义 format 只是缺少 O 以提供与本地时间的时区偏移量。
与格林威治时间 (GMT) 的时差示例:+0200
date_default_timezone_set('America/La_Paz');
echo date('Y-m-d H:i:s O');
2018-01-12 12:10:11 -0400
但是,为了最大限度地提高可移植性/互操作性,我建议使用 ISO8601 日期格式 c
date_default_timezone_set('America/La_Paz');
echo date('c');
2018-01-12T12:10:11-04:00
date_default_timezone_set('Australia/Brisbane');
echo date('c');
2018-01-13T02:10:11+10:00
您也可以使用gmdate,时区偏移字符串将始终为+00:00
date_default_timezone_set('America/La_Paz');
echo gmdate('c');
2018-01-12T16:10:11+00:00
date_default_timezone_set('Australia/Brisbane');
echo gmdate('c');
2018-01-12T16:10:11+00:00
【讨论】:
您可以使用以下方法获取 UTC 时间:
date_default_timezone_set('Asia/Calcutta');
$current_date = date("Y/m/d g:i A");
$ist_date = DateTime::createFromFormat(
'"Y/m/d g:i A"',
$current_date,
new DateTimeZone('Asia/Calcutta')
);
$utc_date = clone $ist_date;
$utc_date->setTimeZone(new DateTimeZone('UTC'));
echo 'UTC: ' . $utc_date->format('Y-m-d g:i A');
【讨论】:
/**
* Converts a local Unix timestamp to GMT
*
* @param int Unix timestamp
* @return int
*/
function local_to_gmt($time = '')
{
if ($time === '')
{
$time = time();
}
return mktime(
gmdate('G', $time),
gmdate('i', $time),
gmdate('s', $time),
gmdate('n', $time),
gmdate('j', $time),
gmdate('Y', $time)
);
}
【讨论】:
您想使用 gmdate 方法获取 GMT 日期。
gmdate("Y-m-d H:i:s");
gmdate 日期格式类似于 date() 方法中的格式。
【讨论】:
$code->created_at->setTimezone('UTC')
这里 $code->created_at = 亚洲/达卡时间。
【讨论】:
在下面找到获取当前 UTC(协调世界时)时间的 PHP 代码
<?php
// Prints the day
echo gmdate("l") . "<br>";
// Prints the day, date, month, year, time, AM or PM
echo gmdate("l jS \of F Y h:i:s A");
?>
【讨论】:
date,您的代码也不包含。