Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-strotime,指定时区_Php_Date_Timezone - Fatal编程技术网

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'))
    )
);