我使用bigint
列类型在MySQL中保存了一个值,日期为2013年8月11日 - 晚上11:55(美国东部时间)
此值在bigint
列中保存为unix时间,值为1376279700
我理解这是1970 jan 01,01 00:00:00
以来的纪元时间。所以我假设如果我使用任何时区初始化DateTime,它应该产生08/11/2013 - 11:55 PM
(以及初始化时使用的任何时区)。
但是给出了以下代码:
$time1 = new DateTime("@1376279700");
$time1->setTimezone("Europe/London");
echo "Created Europe/London - ".$time1->format(DateTime::RFC822);
和
$time2 = new DateTime("@1376279700");
$time2->setTimezone("America/New_York");
echo "Created America/New_York - ".$time2->format(DateTime::RFC822);
我得到了这些值:
创建时间:欧洲/伦敦 - 周一,8月12日13:55:00 +0100
和
创建:America / New_York - Sun,11 Aug 13 23:55:00 -0400
Europe/London
时区自我调整,并以某种方式神奇地知道1376279700
是使用EST时区创建的。
我在这里很困惑。请在这里阐明一些。我正在尝试创建一个时区感知功能,其中我的用户的时区使用了事件的开始日期(08/11/2013 11:55 PM
)。
答案 0 :(得分:1)
构造函数在传递Unix时间戳时忽略时区。
$ts = new DateTime('@946684800');
echo $ts->format('Y-m-d H:i:s') . PHP_EOL; // 2000-01-01 00:00:00
// Setting the time zone does nothing *here* . . .
$pac_tz = new DateTimeZone('America/Los_Angeles');
$ts = new DateTime('@946684800', $pac_tz);
echo $ts->format('Y-m-d H:i:s') . PHP_EOL; // 2000-01-01 00:00:00
// But you can ask for the "same" timestamp
// in a particular time zone.
$ts->setTimeZone($pac_tz);
echo $ts->format('Y-m-d H:i:s') . PHP_EOL; // 1999-12-31 16:00:00
echo '=============' .PHP_EOL;
$time1 = new DateTime("@1376279700");
echo $time1->format('Y-m-d H:i:s').PHP_EOL; // 2013-08-12 03:55:00
$time1_tz = new DateTimeZone("Europe/London");
$time1->setTimezone($time1_tz);
// If it's 2013-08-12 03:55:00 in UTC, what time is it in London?
// London isn't on UTC in the summer (now, as I write this).
echo "Created Europe/London - ".$time1->format(DateTime::RFC822) . PHP_EOL;
$time2 = new DateTime("@1376279700"); // Same as $time1
echo $time2->format('Y-m-d H:i:s').PHP_EOL;
$time2_tz = new DateTimeZone("America/New_York");
// If it's 2013-08-12 03:55:00 in UTC, what time is it in New York?
$time2->setTimezone($time2_tz);
echo "Created America/New_York - ".$time2->format(DateTime::RFC822) . PHP_EOL;
所有输出。 。
2000-01-01 00:00:00
2000-01-01 00:00:00
1999-12-31 16:00:00
=============
2013-08-12 03:55:00
Created Europe/London - Mon, 12 Aug 13 04:55:00 +0100
2013-08-12 03:55:00
Created America/New_York - Sun, 11 Aug 13 23:55:00 -0400