date_default_timezone_set("Asia/Singapore"); // UTC +8
$dt = new DateTime();
$dt->setTimestamp(DateTime::createFromFormat('u', gmdate('u'))->getTimestamp());
echo $dt->getTimezone()->getName(); // Asia/Singapore
echo $dt->format('d M Y H:i:s'); // Correct local time
$dt->setTimezone(new DateTimeZone('UTC'));
echo $dt->format('d M Y H:i:s'); // Correct UTC Time
die;
我想知道时间戳是否包含时区数据。在第3行,您看到我使用gmdate()
,它应该给我UTC / GMT时间。但是当我得到时区&格式化日期时间,它们在本地时间。我没有在我的DateTime
对象中设置时区,给它一个UTC时间戳。它以某种方式知道转换为本地时间。这让我想知道Timezone数据是否包含在时间戳中
答案 0 :(得分:3)
setTimestamp
接受GMT 0
中的时间戳,并且由于GMT
而在gmdate('u')
中传递了该时间戳。 DateTime
对象默认采用您当前的时区。
之后 - 您已正确设置时间戳和当前时区,这就是DateTime
对象格式化新加坡日期的原因。
这让我想知道Timezone数据是否包含在时间戳中
没有。时间戳只存储自unix-epoch以来的秒数。
答案 1 :(得分:1)
时间戳根据解释器时区进行解释。
所以不,它们是标准的,并且本身不包含时区数据。
您的示例证明了这一点,因为您更改了时区,结果也是如此。
如果嵌入了时区数据,结果不会改变。