如何用PHP获得格林威治标准时间?

dri*_*oda 45 php timezone

我有一台设置为EST的服务器,数据库中的所有记录都设置为EST.我想知道如何将其设置为GMT.我想为我的用户提供时区选项.

nic*_*ckf 70

强烈建议避免弄乱UNIX时间戳,使其看起来像一个不同的时区.这是我多次学习困难的一课.

时间戳是格林尼治标准时间1970年1月1日午夜以来的秒数.无论您在世界的哪个位置,无论时区如何,给定的时间戳都代表完全相同的时刻.是的,时间戳"0"表示澳大利亚上午10点1/1/70,伦敦午夜1/1/70和洛杉矶时间下午5点31点,但这并不意味着您可以简单地添加或减去值并保证准确性.

每年让我疲惫不堪的黄金榜样是白天节省的时候.夏令时意味着世界某些地方不存在"时钟时间".例如,在美国的大部分地区,2006年4月2日凌晨2点01分没有这样的时间.

虽然有足够的准可理解的咆哮.我的建议是将日期作为时间戳存储在数据库中,然后......

例如,

$timestamp = time();

echo "BRISBANE: " . date('r', $timestamp) . "\n";
echo "     UTC: " . gmdate('r', $timestamp) . "\n";
date_default_timezone_set('Africa/Johannesburg');
echo "  JOBURG: " . date('r', $timestamp) . "\n";

// BRISBANE: Tue, 12 May 2009 18:28:20 +1000
//      UTC: Tue, 12 May 2009 08:28:20 +0000
//   JOBURG: Tue, 12 May 2009 10:28:20 +0200
Run Code Online (Sandbox Code Playgroud)

这将保持您的价值清洁(您不必担心添加抵消,然后在保存前减去),它将尊重所有夏令时规则,您甚至不必查找该地点的时区你要.

  • 尼克是如此正确的伤害.您希望依赖库或OS调用,以避免必须自己进行时区偏移计算.与nickf类似,我也很难学到这一点. (5认同)
  • 这儿这儿!处理此问题的任何人都应该使用此解决方案.这两个答案都很好,但这两个答案中的两个答案都比较好.仅仅因为它可能会混淆n3wbs并不会使它成为一个不正确的解决方案.谢谢你!旁注:nickf的代表性为78k,p01nd3xt3r为62.这说明了很多用户和他们带来的内容. (5认同)
  • "至少在时区偏移变化之前,无论是由于夏令时还是其他原因." ...而你正在调用我的解决方案? (4认同)
  • "这是一个能够实现这一目标的PHP库" - 它是内置的."如果政治家改变规则会怎么样" - 好:你不必改变你的任何代码 - 如果PHP保持更新,那么它就会起作用."如果你有其他代码获得当地日期怎么办" - 冲洗并重复. (3认同)
  • @ J.Bruni究竟是什么问题?几乎每种编程语言(加上我所知道的每个SQL实现)都有内置方法将时间戳转换为日期和时间. (2认同)
  • 由于时区偏移的变化(例如:夏令时).从上面的答案:"例如,在美国的大部分地区,没有这样的时间在2006年4月2日凌晨2点01分." (2认同)

p01*_*t3r 48

无论服务器在哪个GMT时区,这里都是一个非常简单的方法来获取任何时区的时间和日期.这是通过time()gmdate()函数完成的.该gmdate()函数通常给我们GMT时间,但通过使用该time()函数的技巧我们可以获得GMT + N或GMT-N,这意味着我们可以获得任何GMT时区的时间.

例如,如果您必须获得GMT + 5的时间,您可以按如下方式进行操作

<?php 
  $offset=5*60*60; //converting 5 hours to seconds.
  $dateFormat="d-m-Y H:i";
  $timeNdate=gmdate($dateFormat, time()+$offset);
?>
Run Code Online (Sandbox Code Playgroud)

现在,如果你必须得到GMT-5的时间,你可以从中减去偏移time()而不是添加它,就像在下面的例子中我们得到GMT-4的时间

<?php 
  $offset=4*60*60; //converting 4 hours to seconds.
  $dateFormat="d-m-Y H:i"; //set the date format
  $timeNdate=gmdate($dateFormat, time()-$offset); //get GMT date - 4
?>
Run Code Online (Sandbox Code Playgroud)

  • 我猜这个答案是错误的,因为 time() 函数将获取服务器本地时间。它不会获得 UTC,因此如果您不知道服务器时间是多少,那么您将不会获得预期的时区时间。 (2认同)
  • 这个答案很旧,会产生奇怪的结果 (2认同)

Ahm*_*oub 6

这是与 GMT 不同的时区列表,希望对您有所帮助!

echo '<pre>';
$zones_array = array();        
$timestamp = time();         
# to maintain the original timezone, store before
$default_timezone = date_default_timezone_get();
foreach (timezone_identifiers_list() as $key => $zone) {    
    date_default_timezone_set($zone);
    $zones_array[$key]['zone'] = $zone;
    $zones_array[$key]['diff_from_GMT'] = date('P', $timestamp);
}
# to maintain the original timezone, re-set after
date_default_timezone_set($default_timezone);    
print_r($zones_array);
Run Code Online (Sandbox Code Playgroud)

谢谢!