Php 时区和夏令时问题

Php 时区和夏令时问题,php,date,timezone,dst,Php,Date,Timezone,Dst,我已经看过了其他的解决方案,但似乎没有一个能解决以下方面的时区/dst问题 我正在调用和,这需要传递一个时间范围来检索数据。对于数据库中的每个位置,我都将时区作为UTC偏移量,以及是否遵守夏令时(1或0)。我正在尝试将一些日期(今天和明天)格式化为LST(本地标准时间)在它自己的时区中的格式,以便我可以传递到这些API 我很难弄清楚如何知道一个日期(比如今天)是否在夏令时范围内 以下是我到目前为止的情况: // Get name of timezone for tide station // N

我已经看过了其他的解决方案,但似乎没有一个能解决以下方面的时区/dst问题

我正在调用和,这需要传递一个时间范围来检索数据。对于数据库中的每个位置,我都将时区作为UTC偏移量,以及是否遵守夏令时(1或0)。我正在尝试将一些日期(今天和明天)格式化为LST(本地标准时间)在它自己的时区中的格式,以便我可以传递到这些API

我很难弄清楚如何知道一个日期(比如今天)是否在夏令时范围内

以下是我到目前为止的情况:

// Get name of timezone for tide station
// NOTE: $locationdata->timezone is something like "-5"
$tz_name = timezone_name_from_abbr("", $locationdata->timezone * 3600, false);
$dtz = new DateTimeZone($tz_name);    

// Create time range
$start_time = new DateTime('', $dtz);
$end_time = new DateTime('', $dtz);
$end_time = $end_time->modify('+1 day');

// Modify time to match local timezone
$start_time->setTimezone($dtz);
$end_time->setTimezone($dtz);

// Adjust for daylight savings time
if( $locationdata->dst == '1' )
{
   // DST is observed in this area. 

   // ** HOW DO I KNOW IF TODAY IS CURRENTLY DST OR NOT? **  

}           

// Make call to API using modified time range
...
我该怎么做呢?谢谢

对于数据库中的每个位置,我都将时区作为UTC偏移量,以及是否遵守夏令时(1或0)

这还不够。可以有多个时区,它们都具有相同的标准偏移,都遵守DST,但在不同的时间执行DST转换。(事实上,从历史上看,他们也可能在几年内开始和停止遵守夏令时。)

基本上,数据库应该包含时区ID,而不是偏移量/DST true或false。(假设PHP使用zoneinfo时区数据库,时区ID类似于“Europe/London”。)

编辑:要查找给定的
日期时间的偏移量,可以调用,然后将其与标准时间偏移量进行比较。但是,除非你有明确的时区ID,否则你就有可能进入错误的时区

对于数据库中的每个位置,我都将时区作为UTC偏移量,以及是否遵守夏令时(1或0)

这还不够。可以有多个时区,它们都具有相同的标准偏移,都遵守DST,但在不同的时间执行DST转换。(事实上,从历史上看,他们也可能在几年内开始和停止遵守夏令时。)

基本上,数据库应该包含时区ID,而不是偏移量/DST true或false。(假设PHP使用zoneinfo时区数据库,时区ID类似于“Europe/London”。)


编辑:要查找给定的
日期时间的偏移量,可以调用,然后将其与标准时间偏移量进行比较。但是,除非您有明确的时区ID,否则您将面临获取错误时区的风险。

您可以使用PHP的时间和日期函数:

$tzObj = timezone_open($tz_name);
$dateObj = date_create("07.03.2012 10:10:10", $tzObj);

$dst_active = date_format($dateObj, "I");
如果DST在给定日期处于活动状态,
$DST_active
1
,否则
0

除了在调用
date\u create
时指定时间之外,您还可以传递
“now”
以接收当前日期和时间的值


但是,正如Jon提到的,同一时区偏移内的不同国家可能会遵守DST,而其他国家可能不会遵守。

您可以使用PHP的时间和日期函数:

$tzObj = timezone_open($tz_name);
$dateObj = date_create("07.03.2012 10:10:10", $tzObj);

$dst_active = date_format($dateObj, "I");
如果DST在给定日期处于活动状态,
$DST_active
1
,否则
0

除了在调用
date\u create
时指定时间之外,您还可以传递
“now”
以接收当前日期和时间的值

然而,正如Jon所提到的,同一时区偏移内的不同国家可能会观测DST,而其他国家可能不会。

Cillosis, 我希望您不是在使用Java!我一直在和时间战斗。我还处理天气数据。我使用的大多数数据都是本地标准时间(忽略夏令时)。我还需要使用其他时区的时间,发现Java一直在读取我的计算机的时区。我还不断遇到不推荐的类。我想出了一个有效的解决办法。这有点麻烦,所以我有大量的文档记录,它只存在于一个函数中。我的解决方案是相对时间。我已将本地时间设置为UTC。我是减去GMT偏移量而不是加上它。我真的不关心实际的时间,我关心的只是两次之间的差异。它工作得很好。 祝你好运, 我希望您不是在使用Java!我一直在和时间战斗。我还处理天气数据。我使用的大多数数据都是本地标准时间(忽略夏令时)。我还需要使用其他时区的时间,发现Java一直在读取我的计算机的时区。我还不断遇到不推荐的类。我想出了一个有效的解决办法。这有点麻烦,所以我有大量的文档记录,它只存在于一个函数中。我的解决方案是相对时间。我已将本地时间设置为UTC。我是减去GMT偏移量而不是加上它。我真的不关心实际的时间,我关心的只是两次之间的差异。它工作得很好。
祝你好运

函数
时区\u name\u from_abbr(“,$locationdata->timezone*3600,false)
从偏移量返回时区ID,因此
-5
可能会返回“America/New York”。@cillosis:您是否相信该映射是准确的?因为它会模棱两可。我将编辑以回答特定的问题…我相信会有歧义,但目前我并不担心这一点。我更关心的是确定一个地区目前是否在观测DST。@cillosis:如果你不知道自己真正感兴趣的地区,很难知道。。。但正如我所说,您可以在DateTime上调用
getOffset
来查找。您可以使用cron作业使tzdata(以及DST)定义保持最新,以便经常更新此PECL包:函数
timezone\u name\u from_abbr(“,$locationdata->timezone*3600,false)
从偏移量返回时区ID,因此
-5
可能会返回“America/New York”。@cillosis:您是否相信该映射是准确的?因为它会模棱两可。将编辑以回答特定的问题,但…我相信会有ambig