PHP – strtotime,指定时区

我有一个datestring,说' 2008-09-11 '。 我想要得到一个时间戳,但我需要dynamic指定一个时区(而不是PHP默认值)。

所以总结一下,我有两个string:

 $dateStr = '2008-09-11'; $timezone = 'Americas/New_York'; 

我如何得到这个时间戳?

编辑:一天的时间将是当天的午夜…. $ dateStr ='2008-09-11 00:00:00';

 $date = new DateTime($dateStr, new DateTimeZone($timezone)); 

$timestamp = $date->format('U');

如果因为某些原因,你会使用<5.2(Heaven forbid)。

 $reset = date_default_timezone_get(); date_default_timezone_set('America/New_York'); $stamp = strtotime($dateStr); date_default_timezone_set($reset); 

但是5.2以上的东西,我强烈build议你select@ salathe的答案。

被接受的答案是伟大的,如果你运行PHP> 5.2(我认为这是他们添加DateTime类的版本)。 如果你想支持一个较老的版本,你不想input太多,或者如果你只是喜欢function的方法有另一种方式,也不会修改全局设置:

 $dateStr = '2008-09-11 00:00:00'; $timezone = 'America/New_York'; $dtUtcDate = strtotime($dateStr. ' '. $timezone); 

如果你打算使用时区,我build议你使用DateTime类,在这种情况下,DateTime :: createFromFormat()函数可以让你做这样的事情:

 $start = "2015-01-14 11:59:43"; $timezone = "America/Montreal"; $tz = new DateTimeZone($timezone); $dt = DateTime::createFromFormat('Ymd H:i:s', $start, $tz); 

当你把$ tz放在DateTime :: createFromFormat函数中时,你告诉它你给的date是什么时区,所以当你需要将它转换为另一个时区时,你所要做的就是这样的:

 $start = $dt->setTimeZone(new DateTimeZone('UTC')); 

每当你指的是一个确切的时刻,坚持时间根据一个统一的标准,不受夏时制的影响。 (GMT和UTC在这方面是等价的,但是最好使用UTC这个术语。注意UTC也被称为Zulu或Z时间。

如果您select使用本地时间值来保存时间,请包括UTC的本地时间偏移,以便稍后可以明确解释时间戳。

在某些情况下,您可能需要同时存储UTC时间和当地时间。 通常这是用两个单独的字段来完成的,但是一些平台支持可以存储在单个字段中的datetimeoffsettypes。

将时间戳存储为数字值时,请使用Unix时间 – 这是自1970-01-01T00:00:00Z(不包括闰秒)以来的整秒数。 如果您需要更高的精确度,请改用毫秒。 此值应始终基于UTC,而不进行任何时区调整。

如果以后需要修改时间戳,请包含原始时区ID,以便确定偏移量是否可能与logging的原始值发生了变化。

在安排未来事件时,通常优先使用本地时间,而不是UTC,因为偏移是常见的变化。 查看答案和博客post。

请记住,时区偏移不总是整数小时(例如,印度标准时间是UTC + 05:30,尼泊尔使用UTC + 05:45)。

如果使用Java,请使用java.time for Java 8,或者使用Joda Time for Java 7或更低版​​本。 如果使用.NET,请考虑使用Noda Time。 如果在不使用Noda Time的情况下使用.NET,则认为DateTimeOffset通常是比DateTime更好的select。 如果使用Perl,请使用DateTime。 如果使用Python,请使用pytz或dateutil。 如果使用JavaScript,请使用带有时区扩展名的moment.js。 如果使用PHP> 5.2,则使用由DateTime和DateTimeZone类提供的本地时区转换。 使用时要小心。

DateTimeZone :: listAbbreviations() – 查看答案。 要保持PHP与最新的Olson数据,定期安装timezonedb PECL包; 见答案。

如果使用C ++,请确保使用正确实现IANA时区数据库的库。 包括cctz,ICU和Howard Hinnant的“tz”图书馆。

不要使用Boost进行时区转换。 虽然其API声称支持标准IANA(又名“zoneinfo”)标识符,但它粗略地将其映射到固定偏移量,而不考虑每个区域可能具有的丰富历史变化。

(此外,该文件已经不在维护中。)

大多数业务规则使用民用时间,而不是UTC或GMT。 因此,计划在应用应用程序逻辑之前将UTC时间戳转换为本地时区。

请记住,时区和偏移不是固定的,可能会改变。 例如,历史上美国和英国使用相同的date来“前进”和“后退”。

然而,在2007年,美国改变了时钟改变的date。 这意味着,一年中的48周,伦敦时间和纽约时间之间的差别是5小时和4周(春季3次,秋季1次)是4小时。 在任何涉及多个区域的计算中都要注意这样的项目。

考虑时间types(实际事件时间,广播时间,相对时间,历史时间,周期时间)您需要存储哪些元素(时间戳,时区偏移和时区名称)以便正确检索 – 请参阅“时间types”回答。

保持你的操作系统,数据库和应用程序数据文件在他们自己和世界其他地方之间保持同步。

在服务器上,将硬件时钟和操作系统时钟设置为UTC而不是本地时区。

不pipe以前的要点是什么,包括网站在内的服务器端代码不应该期望服务器的本地时区是特别的东西。 见答案。

在所有服务器上使用NTP服务。

如果使用FAT32,请记住时间戳存储在本地时间,而不是UTC。

在处理周期性事件(例如,每周电视节目)时,请记住,时间随着DST的变化而变化,并且在不同时区之间会有所不同。

总是查询date – 时间值作为下限包括,上限排他(> =,<)。