遗忘悠剑

🍀 记录精彩的程序人生 开始使用

计算全国油价调整日期,期待有更好的计算方式~

工作上,遇到了一个获取油价调整时间的需求,晚上下班了,回想了下这个问题,然后顺便百度了下油价调整周期表,结果并没找到,但是发现有个规则,也就是 10 个工作日调整一次,那么每年的第一次调整是哪天呢?带着这个疑问简单研究了下,发现是去年最后一次调整日期 +10 个工作日,得出新年的第一次调整周期,以此类推 ~
好了,明白了原理,代码就好写了 ~

油价调整规则

  • 国内油价调整规则:成品油调整周期为 10 个工作日,也就是说是十个工作日之后油价调整窗口开启一次,而工作日不包含周六日和法定假日。

    根据这个规则,我们就可以使用程序计算出其调价日期来了
    不多说,直接进入正题。
    简单实现一下,仅做记录用,估计有更好的方式来实现吧!

<?php
index();
function index()
{
    $year = $_GET['year'] ?? '2021';
    $date = $_GET['date'] ?? '01-15';
    $start_date = $year . '-' . $date;
    $end_date = $year . '-12-31';
    $year_date = dateRange($start_date, $end_date);
    echo '<pre>';
    //var_dump($year_date);
    $holiday = getHoliday($year);
    $n = 0;
    $zm = [6, 0];//周末
    foreach ($year_date as $key => $val) {
        $date = substr(strstr($val, '-'), 1);
        $week = date("w", strtotime($val));//星期
        // 周一~周5且不是假期  或者 周六到周日 且不是法定调休  即可得到工作日
        if (
            (!isset($holiday[$date]) && !in_array($week, $zm)) ||
            (isset($holiday[$date]) && $holiday[$date]['holiday'] == false && in_array($week, $zm))
        ) {
            if ($n % 10 == 0)
                $out[] = $val;
            $n++;
        }
    }
    var_dump(json_encode($out));
}

/**
 * 日期范围得到一个天为单位的数组
 * @param string $start_date Y-m-d:2020-06-01
 * @param string $end_date Y-m-d:2020-06-07
 * @return array
 */
function dateRange($start_date, $end_date)
{
    if ($start_date > $end_date) {
        $start = strtotime($end_date);
        $end = strtotime($start_date);
        $is_reverse = true;
    } else {
        $start = strtotime($start_date);
        $end = strtotime($end_date);
        $is_reverse = false;
    }
    $i = 0;
    $range = [];
    while ($start <= $end) {
        $range[$i] = date('Y-m-d', $start);
        $start = strtotime('+1 day', $start);
        $i++;
    }
    return $is_reverse ? array_reverse($range) : $range;
}

function getHoliday($year = null)
{
    $year = $year ?? date('y');
//    $cacheKey = "holiday_{$year}";
//    $holiday = \Cache::get($cacheKey);
//    if(is_null($holiday)){
    $holiday = json_decode(file_get_contents('http://timor.tech/api/holiday/year/' . $year), true);
//        if($holiday['code'] == '0')
//            \Cache::put($cacheKey, $holiday, Carbon::now()->addYear(1));
//    }
    return $holiday['holiday'];
}
  • 程序运行结果
[
    "2021-01-15",
    "2021-01-29",
    "2021-02-18",
    "2021-03-03",
    "2021-03-17",
    "2021-03-31",
    "2021-04-15",
    "2021-04-28",
    "2021-05-14",
    "2021-05-28",
    "2021-06-11",
    "2021-06-28",
    "2021-07-12",
    "2021-07-26",
    "2021-08-09",
    "2021-08-23",
    "2021-09-06",
    "2021-09-18",
    "2021-10-09",
    "2021-10-22",
    "2021-11-05",
    "2021-11-19",
    "2021-12-03",
    "2021-12-17",
    "2021-12-31"
]

2021 年我国成品油共迎 25 轮调价窗口期,首次调整时间为 1 月 15 日 24 时。

具体油价调整时间表看下图(或文字)。成品油油价调整时间为 10 个工作日一次,日期分别为:

1月15日;1月29日;
2月18日;
3月3日;3月17日;3月31日;
4月15日;4月28日;
5月14日;5月28日;
6月11日;6月28日;
7月12日;7月26日;
8月9日;8月23日;
9月6日;9月18日;
10月9日;10月22日;
11月5日;11月19日;
12月3日;12月17日;12月31日。

image.png


🐶 你走,我不送你。你来,风雨无阻,我去接你。

评论
留下你的脚步
推荐阅读