【发布时间】:2015-10-19 16:11:06
【问题描述】:
我发现我可以使用天数
cal_days_in_month()
所以我可以使用cal_days_in_month() * 24 来获取小时数。
但是有没有直接的函数来获取给定月份的小时数?
【问题讨论】:
-
简短的回答是“不”。
-
虽然这种方法适用于大多数月份,但这取决于您是否希望在夏令时发生变化的月份保持准确
标签: php
我发现我可以使用天数
cal_days_in_month()
所以我可以使用cal_days_in_month() * 24 来获取小时数。
但是有没有直接的函数来获取给定月份的小时数?
【问题讨论】:
标签: php
这个功能应该让你得到你正在寻找的东西:
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(闰年)
编辑:将所有参数设为可选。
【讨论】:
这是一种尊重 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(),所以我们必须遍历日期并计算它们。 (如果有人有更好的主意,让我们听听。)
【讨论】: