【问题标题】:php - how to get number of hours in given month?php - 如何获取给定月份的小时数?
【发布时间】:2015-10-19 16:11:06
【问题描述】:

我发现我可以使用天数

cal_days_in_month()

所以我可以使用cal_days_in_month() * 24 来获取小时数。

但是有没有直接的函数来获取给定月份的小时数?

【问题讨论】:

  • 简短的回答是“不”。
  • 虽然这种方法适用于大多数月份,但这取决于您是否希望在夏令时发生变化的月份保持准确

标签: php


【解决方案1】:

这个功能应该让你得到你正在寻找的东西:

function cal_hours_in_month($month = false, $year = false) {
    if($year === false) $year = date('Y');
    if($month === false) $month = date('n');
    $first = mktime(0, 0, 0, $month, 1, $year);
    $last = mktime(23, 59, 00, $month+1, 0, $year);

    return ($last - $first) / 3600;
}
echo cal_hours_in_month(2015, 7);

为了方便起见,从this answer 借用代码。

这应该具有补偿夏令时的额外好处,但您可能需要确保您的date_default_timezone_set() 是正确的。

琐碎的兴趣点:请记住,由于偶尔会对 DST 进行调整,因此在未来某个时间获得一个月的持续时间可能最终会变得不准确。

我的环境(美国/芝加哥地区)在 2015 年 7 月这个月返回 743.983(四舍五入)。

echo cal_hours_in_month(2, 2015); 返回 671.983(非闰年)

echo cal_hours_in_month(2, 2016);returns 695.983(闰年)

编辑:将所有参数设为可选。

【讨论】:

    【解决方案2】:

    这是一种尊重 DST 和时区的方法。

    $timezone = new DateTimezone('Europe/Berlin');
    $begin = new DateTime('2015-03-01 00:00:00', $timezone);
    $end = new DateTime('2015-03-31 23:59:59', $timezone);
    $interval = new DateInterval('PT1H');
    $period = new DatePeriod($begin, $interval, $end);
    
    $count = 0;
    
    foreach ($period as $date)
        ++$count;
    
    echo $count; // 743 for March in Germany
    

    不幸的是,DatePeriod 只实现了Traversable,不支持count(),所以我们必须遍历日期并计算它们。 (如果有人有更好的主意,让我们听听。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-14
      • 2020-03-26
      • 1970-01-01
      • 2012-01-13
      相关资源
      最近更新 更多