【问题标题】:Daylight savings calculation in PhpPhp 中的夏令时计算
【发布时间】:2016-08-02 22:33:57
【问题描述】:

在我的应用程序中,我在 mysql 中有 365 天的 varchar 字段,格式为 '0000-04-12'(4 月 12 日)。现在我有一个函数应该检查字段中的特定日期是否在加拿大卡尔加里的夏令时范围内,范围从 2:00 pm Second Sunday of March 到 2:00 pm 11 月的第一个星期日。 并相应地返回 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 ;
}

?>

现在它返回相对于特定年份的星期,但我需要检查相对于月份的星期以执行特定逻辑,我无法得到。谢谢。

【问题讨论】:

  • 那么,您依赖的是服务器的默认时区吗? MySQL中的日期是如何保存的?作为UTC还是存在偏移量?另外,请查看this question and answer。
  • @Mjh 我们可以看到 DateTime 初始化,因此所有 DateTime 将具有相同的 TZ。此外,他似乎在这里没有任何 TZ 情报,因此我们可以假设 DST 已经生效,具体取决于提供的日期。
  • @Mjh 它不是 UTC 格式,而是像 '0000-04-12' 这样的字符串格式,我遇到了特定的问题。
  • 好的,那么当您保存日期时,用于创建这样一个字符串的时区是什么?日期/时间必须由某种软件生成,它使用什么时区?你需要有一个起点和转换点。您有转换点 (Canada/Calgary)。您需要找出起始日期,以便准确确定 DST 是否在您所在时区的特定日期生效。
  • 现在我只是转换为简单的时间日期 $today = substr_replace($time,date('Y'),0,4); $date = new DateTime($today);但我已经搜索到卡尔加里使用山地时区 UTC-07:00

标签: php datetime dst


【解决方案1】:

试试这个:

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;
}

strtotime() 是一个很棒的函数。

【讨论】:

    【解决方案2】:

    @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
    }
    

    您不应该比较日期函数中的字符串。自 PHP 5.0 起,使用 DateTime 也是处理 PHP 中日期/时间的更好方法。

    【讨论】:

      猜你喜欢
      • 2018-06-15
      • 2013-11-24
      • 2017-07-11
      • 1970-01-01
      • 2013-12-09
      • 1970-01-01
      • 2011-08-01
      • 2023-01-27
      • 2012-12-18
      相关资源
      最近更新 更多