Php中的夏令时计算

Php中的夏令时计算,php,datetime,dst,Php,Datetime,Dst,在我的应用程序中,我在mysql中使用了365天的varchar字段,格式为特定格式,即'0000-04-12'(4月12日)。现在,我有一个功能,可以检查字段中的特定日期是否位于加拿大卡尔加里的夏令时区,其范围为3月第二个星期日下午2:00到11月第一个星期日下午2:00。并相应返回true或false <?php /* @param $time form Database e.g. 0000-04-12 */ function isDaylightSaving($time){

在我的应用程序中,我在mysql中使用了365天的varchar字段,格式为特定格式,即'0000-04-12'(4月12日)。现在,我有一个功能,可以检查字段中的特定日期是否位于加拿大卡尔加里的夏令时区,其范围为3月第二个星期日下午2:00到11月第一个星期日下午2:00。并相应返回true或false

<?php 
/*
 @param $time form Database e.g. 0000-04-12
*/
function isDaylightSaving($time){
    // to replace 0000 in start with current year
    $today = substr_replace($time,date('Y'),0,4);
    $date = new DateTime($today);
    $week = $date->format('W');

    // TO DO 
    // find date falls between 2:00 pm Second Sunday of March to 2:00 pm First Sunday of November.

    return ;
}

?>

现在,它返回与特定年份相关的周,但我需要检查与月份相关的周,以执行特定的逻辑,我无法获取。谢谢。

尝试以下操作:

if($time > date('Y-m-d',strtotime('second sunday of march')) &&
   $time < date('Y-m-d',strtotime('first sunday of november'))){
    return true;
}else{
    return false;
}
if($time>date('Y-m-d',strottime('3月第二个星期日'))&&
$time<日期('Y-m-d',标准时间('11月的第一个星期日')){
返回true;
}否则{
返回false;
}

strotime()是一个很好的函数。

由@Ezenhis给出的示例听起来不错,但缺少一些元素。 扩展它:

$low = new DateTime('@'.strtotime('second sunday of march'));
$high = new DateTime('@'.strtotime('first sunday of november'));
if($date > $low && $date < $high) {
    // we're good
}
$low=新的日期时间('@'.strotime('3月的第二个星期日');
$high=新的日期时间('@'.strotime('11月的第一个星期日');
如果($date>$low&$date<$high){
//我们很好
}

不应该比较日期函数中的字符串。自PHP5.0以来,在PHP中使用DateTime也是处理日期/时间的更好方法。

那么,您是否依赖服务器的默认时区?如何在MySQL中保存日期?作为UTC或是否存在偏移?另外,请检查。@Mjh我们可以看到DateTime init,因此所有DateTime都将具有相同的TZ。此外,他这里似乎没有任何TZ intel,因此我们可以根据提供的日期假设DST在设备中。@Mjh不是utc格式的字符串格式,如“0000-04-12”,我遇到了特殊问题。那么,当您保存日期时,创建这样一个字符串所用的时区是什么?日期/时间必须由某种软件生成,它使用什么时区?你需要有一个起点和转换点。您有转换点(
加拿大/卡尔加里
)。您需要找出起始日期,以便准确确定DST是否在您所在时区的特定日期生效。现在,我只是转换为简单的时间日期$today=substr_replace($time,date('Y'),0,4)$日期=新的日期时间($今天);但我搜索过卡尔加里使用山地时区UTC-07:00