默认时区不同时,时间戳是否应该更改?

时间:2014-04-15 09:08:31

标签: php

请理解,这个问题没有得到there的回答。因为如果他们在there中所说的是真的,时间戳应该根据给定时间的时区而变化。

我遇到了一个项目的问题,因为似乎服务器上设置的时区与收集数据的机器完全不同。当PHP中的默认时区更改时,时间戳是否会更改?是应该还是不应该?

php -r "date_default_timezone_set(\"Asia/Jakarta\");echo time();"
1397552668

php -r "echo time();"
1397552675

似乎它没有......我是对的吗?或者我做错了什么?

另一项测试:

<?php
echo date_default_timezone_get();
echo " : ".time();
echo "\n";
date_default_timezone_set("Asia/Jakarta");
echo date_default_timezone_get();
echo " : ".time();
echo "\n";
?>

结果:

Europe/Berlin : 1397553155
Asia/Jakarta : 1397553155

2 个答案:

答案 0 :(得分:4)

您的问题似乎是date_default_timezone_set所做的错误假设。但首先要从计算机如何保持时间开始:

  • 计算机的BIOS通常会保留时间,但通常只设置日期/小时/分钟而没有时区信息
  • 当计算机的操作系统启动时,它使用BIOS的时间作为起点
  • 操作系统有一个时区设置,它告诉它如何解释BIOS的时间并找出当前绝对时间点是什么
    • 请注意,某些操作系统会将BIOS的时间解释为本地时间,而其他操作系统会将BIOS的时间解释为UTC时间;无论哪种方式,BIOS时间+操作系统时区设置告诉操作系统当前的绝对时间和当前本地时间是什么
  • 现代操作系统偶尔会通过NTP与互联网时间服务器联系,以获得绝对正确的时间;如果它不同,它可以根据此调整BIOS的时钟
  • 现在操作系统已经知道它到底是什么时候,它可以在你想要的任何时区或通用UNIX时间给你本地时间

现在看Does PHP time() return a GMT/UTC Timestamp?了解“本地”和“绝对”时间之间的区别。了解操作系统内部处理绝对时间(可能采用高分辨率UNIX时间戳的形式)至关重要。它不会以“HH:MM:SS”的形式保留时间,它只会根据您设置的时区显示 ,当它向您传达时间时,人类。

date_default_timezone_set所做的只是选择显示人类可读时间的时区。它不会改变操作系统的时间或PHP对当前时间或其他任何内容的理解。它所做的只是告诉PHP当您执行date('H:i')之类的操作时,显示哪个时区的本地时间。

答案 1 :(得分:0)

UNIX时间戳与时区无关,因此time()应始终返回相同的值。其他时间操作函数(例如DateDatetime)将取决于设置的时间戳,因此如果您使用UNIX时间戳进行进一步操作,您会注意到差异。