PHP-strotime,指定时区
我有一个日期字符串,比如“PHP-strotime,指定时区,php,date,timezone,Php,Date,Timezone,我有一个日期字符串,比如“2008-09-11”。我想从中获得一个时间戳,但我需要动态地指定一个时区(而不是PHP默认值) 总而言之,我有两个字符串: $dateStr = '2008-09-11'; $timezone = 'Americas/New_York'; 我如何得到这个的时间戳 编辑:一天的时间是那天的午夜$dateStr='2008-09-11 00:00:00' $date = new DateTime($dateStr, new DateTimeZone($timezone)
2008-09-11
”。我想从中获得一个时间戳,但我需要动态地指定一个时区(而不是PHP默认值)
总而言之,我有两个字符串:
$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')代码>如果出于某种原因,您使用的是如果您运行的是PHP>5.2(我认为这是他们添加DateTime类的版本),那么这将起作用。如果您希望支持旧版本,则不希望键入太多,或者如果您只是喜欢功能性方法,则还有另一种方法也不会修改全局设置:
$dateStr = '2008-09-11 00:00:00';
$timezone = 'America/New_York';
$dtUtcDate = strtotime($dateStr. ' '. $timezone);
如果要使用时区,我建议您使用DateTime类,在本例中使用DateTime::createFromFormat()函数,该函数将允许您执行以下操作:
$start = "2015-01-14 11:59:43";
$timezone = "America/Montreal";
$tz = new DateTimeZone($timezone);
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $start, $tz);
$start = $dt->setTimeZone(new DateTimeZone('UTC'));
在DateTime::createFromFormat函数中放入$tz时,您会告诉它您给出的日期所在的时区,因此当您需要将其转换为另一个时区时,您只需执行以下操作:
$start = "2015-01-14 11:59:43";
$timezone = "America/Montreal";
$tz = new DateTimeZone($timezone);
$dt = DateTime::createFromFormat('Y-m-d H:i:s', $start, $tz);
$start = $dt->setTimeZone(new DateTimeZone('UTC'));
无论何时,只要你指的是一个精确的时刻,就要根据不受夏令时影响的统一标准来确定时间。(GMT和UTC在这方面是等效的,但最好使用术语UTC。请注意,UTC也称为Zulu或Z时间。)
相反,如果您选择使用本地时间值保留时间,请包含与UTC的本地时间偏移,以便稍后可以明确地解释时间戳
在某些情况下,您可能需要同时存储UTC时间和等效的本地时间。通常这是通过两个单独的字段来完成的,但是一些平台支持datetimeoffset类型,可以将这两个字段都存储在一个字段中
将时间戳存储为数值时,请使用Unix time-这是自1970-01-01T00:00:00Z以来的整秒数(不包括闰秒)。如果需要更高的精度,请使用毫秒。此值应始终基于UTC,不进行任何时区调整
如果以后可能需要修改时间戳,请包含原始时区ID,以便确定偏移量是否已从记录的原始值更改
安排未来事件时,通常首选本地时间而不是UTC,因为偏移量通常会发生变化。请参阅答案和博客文章
请记住,时区偏移并不总是小时数的整数(例如,印度标准时间为UTC+05:30,尼泊尔使用UTC+05:45)
如果使用Java,请对Java 8使用Java.time,或对Java 7或更低版本使用Joda time。
如果使用.NET,请考虑使用NODA时间。
如果在没有NoDA时间的情况下使用.NET,那么考虑DATETMETROOP通常比DATETIME更好的选择。
如果使用Perl,则使用DateTime。
如果使用Python,请使用pytz或dateutil。
如果使用JavaScript,请使用带有矩时区扩展名的矩.js。
如果使用PHP>5.2,请使用DateTime和DateTimeZone类提供的本机时区转换。使用时要小心
DateTimeZone::ListAbstracts()-请参阅答案。为了使PHP保持最新的Olson数据,定期安装TimeZoneDBPECL包;见答案
如果使用C++,请确保使用一个使用正确实现IANA时区数据库的库。其中包括cctz、ICU和Howard Hinnant的“tz”图书馆
不要将Boost用于时区转换。虽然其API声称支持标准IANA(又名“zoneinfo”)标识符,但它粗略地将它们映射到固定偏移量,而没有考虑每个分区可能发生的丰富变化历史
(此外,该文件已无法维护。)
大多数业务规则使用民用时间,而不是UTC或GMT。因此,在应用应用程序逻辑之前,计划将UTC时间戳转换为本地时区
请记住,时区和偏移量不是固定的,可能会发生变化。例如,历史上,美国和英国使用相同的日期来“向前冲”和“向后退”
然而,在2007年,美国改变了时钟的更换日期。这意味着,在一年中的48周内,伦敦时间与纽约时间之差为5小时,而在4周内(春季3周,秋季1周),伦敦时间与纽约时间之差为4小时。在涉及多个分区的任何计算中,请注意类似的项
考虑时间类型(实际事件时间、广播时间、相对时间、历史时间、重现时间)以及您需要存储哪些元素(时间戳、时区偏移量和时区名称)以便正确检索-请参阅答案中的“时间类型”
让您的操作系统、数据库和应用程序tzdata文件在它们与世界其他地方之间保持同步
在服务器上,将硬件时钟和操作系统时钟设置为UTC而不是本地时区
不管前面的要点是什么,服务器端代码(包括网站)都不应该期望服务器的本地时区是特定的。见答案
在所有服务器上使用NTP服务。
如果使用FAT32,请记住时间戳存储在本地时间,而不是UTC
当处理重复发生的事件(例如每周电视节目)时,请记住,时间会随着DST的变化而变化,并且在不同的时区会有所不同
始终将日期-时间值查询为包含下限的、不包含上限的(>=,简洁的答案(无需更改默认时区)
滔滔不绝的回答
/**
* Returns the timestamp of the provided time string using a specific timezone as the reference
*
* @param string $str
* @param string $timezone
* @return int number of the seconds
*/
function strtotimetz($str, $timezone)
{
return strtotime(
$str, strtotime(
// convert timezone to offset seconds
(new \DateTimeZone($timezone))->getOffset(new \DateTime) - (new \DateTimeZone(date_default_timezone_get()))->getOffset(new \DateTime) . ' seconds'
)
);
}
var_export(
date(
'Y-m-d',
strtotimetz('this monday', 'America/New_York')
)
);
使用strotime
的第二个选项更改函数的参考框架。顺便说一下,我不想更新脚本的默认时区:
int-strottime(字符串$time[,int$now=time()])
功能
期望得到一个包含英文日期格式的字符串,并且
将尝试将该格式解析为Unix格式
var_dump(
date(
'Y-m-d',
strtotime('this tuesday', strtotime(-8 . ' hours'))
)
);