PHP日期/ GMT古怪

时间:2012-05-19 03:29:29

标签: php date timezone gmt

要么我失去了理智,要么我对自己正在做的事情一无所知。我倾向于后者。

我正在尝试转换这个:1316826000,我非常有信心应该是星期六,2011年9月24日01:00:00 GMT

http://www.onlineconversion.com/unix_time.htm证实了这一点。

http://www.unixtimestamp.com/index.php告诉我09/23/11美国东部时间晚上8:00:00,到目前为止一切顺利。我碰巧在EST,这是我想从PHP回来的结果。

当我约会时('l,M d,Y,h:ia',$ iTime),我得到:2011年9月23日星期五,凌晨12:00,整整20个小时。

我已使用日期('c')确认服务器的时间是正确的。日期('c')输出为:2012-05-19T03:19:20 + 00:00。服务器位于中央时区,当前时间是晚上10点20分。 5月18日。

echo date_default_timezone_get()输出“GMT”(使用date_default_timezone_set('GMT')设置脚本中的其他位置)

我错过了什么?到目前为止,我所读到的任何内容都无法解释我如何得到一个落后20小时的结果。如果它快一点一小时,我至少可以把它包裹起来作为某种DST的习惯,但是20? Crazyness!谢谢你的阅读!

2 个答案:

答案 0 :(得分:1)

检查你的php.ini对date.timezone的说法。 在unix中,它通常在这里:/etc/php.ini 然后使用PHP识别的适当时区: http://www.php.net/manual/en/timezones.php

date.timezone = 'America/New_York'

然后重新加载您的网络服务器。

Unix时间只是指自纪元以来的秒数。与时区无关。对于你离开GMT的每个区域,时区只需从unix时间加1或小时减去1小时(3600秒)。 一个例子:

$userTimezone = new DateTimeZone('America/New_York');
$gmtTimezone = new DateTimeZone('GMT');
$myDateTime = new DateTime('2014-01-22 11:44', $gmtTimezone);
$offset = $userTimezone->getOffset($myDateTime);
echo $offset;

输出:-14400或4小时。纽约和GMT之间的差异是什么

答案 1 :(得分:0)

将一些Java代码与Joda-Time 2.3库一起使用,因为我不知道PHP ...

long m = 1316826000L;

DateTime dateTimeUtc = new DateTime( m * 1000L, DateTimeZone.UTC );
DateTime dateTimeNewYork = dateTimeUtc.toDateTime( DateTimeZone.forID( "America/New_York" ) );

System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeNewYork: " + dateTimeNewYork );

我可以告诉你,从1970年开始的UTC / GMT(Unix Epoch)开始的1316826000秒......

dateTimeUtc: 2011-09-24T01:00:00.000Z
dateTimeNewYork: 2011-09-23T21:00:00.000-04:00

因此,正如评论者所说,美国东部时间晚上8点,但EST当天没有生效。 DST(Daylight Saving Time)(白痴,正如你所正确指出的那样)是当年(2011年)的in effect until November 9。因此,时间推进一小时,到晚上9点。

在格林威治标准时间/ UTC中,这意味着第二天上午凌晨1点。

美国东海岸的标准时间比UTC / GMT晚5小时。使用夏令时,它比UTC / GMT落后4小时(靠近一小时)。

你感到困惑的地方:

  • 您的时间格式/转换错误
    由于我不了解PHP,我无法帮助。
  • 您应该使用合格的日期时间库进行此类工作。
    日期时间工作复杂,棘手,容易混淆且容易出错。
    This question讨论了Joda-Time(for Java)各种PHP库的可能性。
  • 您使用了三个字母的时区代码。避免使用这些
    这些代码既不是标准化也不是唯一的 - 有共同的重复。相反,请使用proper time zone names。在你的美国东海岸,“America / New_York”。此外,在这种情况下,您将时区区域和规则(美国东海岸)与这些规则(EST)的特定应用混淆。说“America / New_York”的意思是“无论时区规则在该日期生效,而”EST“(如果解释为Eastern Standard Time in US)则表示”UTC-05:00“。所以要么(a)使用时区名称,例如“America / New_York”,或(b)使用特定的偏移量,例如“-05:00”。