获取一个基于时间偏移的Unix时间戳

发布于 2020-11-09 12:55:00

how 获取一个基于时间偏移的Unix时间戳?

查看更多

浏览量
2678
1 个回答
猫哥
猫哥 项目组成员 2020-11-09
希望我的回答能对你有所帮助
/**
 * 获取一个基于时间偏移的Unix时间戳
 *
 * @param string $type     时间类型,默认为day,可选minute,hour,day,week,month,quarter,year
 * @param int    $offset   时间偏移量 默认为0,正数表示当前type之后,负数表示当前type之前
 * @param string $position 时间的开始或结束,默认为begin,可选前(begin,start,first,front),end
 * @param int    $year     基准年,默认为null,即以当前年为基准
 * @param int    $month    基准月,默认为null,即以当前月为基准
 * @param int    $day      基准天,默认为null,即以当前天为基准
 * @param int    $hour     基准小时,默认为null,即以当前年小时基准
 * @param int    $minute   基准分钟,默认为null,即以当前分钟为基准
 * @return int 处理后的Unix时间戳
 */
public static function unixtime($type = 'day', $offset = 0, $position = 'begin', $year = null, $month = null, $day = null, $hour = null, $minute = null)
{
    $year = is_null($year) ? date('Y') : $year;
    $month = is_null($month) ? date('m') : $month;
    $day = is_null($day) ? date('d') : $day;
    $hour = is_null($hour) ? date('H') : $hour;
    $minute = is_null($minute) ? date('i') : $minute;
    $position = in_array($position, array('begin', 'start', 'first', 'front'));

    switch ($type) {
        case 'minute':
            $time = $position ? mktime($hour, $minute + $offset, 0, $month, $day, $year) : mktime($hour, $minute + $offset, 59, $month, $day, $year);
            break;
        case 'hour':
            $time = $position ? mktime($hour + $offset, 0, 0, $month, $day, $year) : mktime($hour + $offset, 59, 59, $month, $day, $year);
            break;
        case 'day':
            $time = $position ? mktime(0, 0, 0, $month, $day + $offset, $year) : mktime(23, 59, 59, $month, $day + $offset, $year);
            break;
        case 'week':
            $time = $position ?
                mktime(0, 0, 0, $month, $day - date("w", mktime(0, 0, 0, $month, $day, $year)) + 1 - 7 * (-$offset), $year) :
                mktime(23, 59, 59, $month, $day - date("w", mktime(0, 0, 0, $month, $day, $year)) + 7 - 7 * (-$offset), $year);
            break;
        case 'month':
            $time = $position ? mktime(0, 0, 0, $month + $offset, 1, $year) : mktime(23, 59, 59, $month + $offset, cal_days_in_month(CAL_GREGORIAN, $month + $offset, $year), $year);
            break;
        case 'quarter':
            $time = $position ?
                mktime(0, 0, 0, 1 + ((ceil(date('n', mktime(0, 0, 0, $month, $day, $year)) / 3) + $offset) - 1) * 3, 1, $year) :
                mktime(23, 59, 59, (ceil(date('n', mktime(0, 0, 0, $month, $day, $year)) / 3) + $offset) * 3, cal_days_in_month(CAL_GREGORIAN, (ceil(date('n', mktime(0, 0, 0, $month, $day, $year)) / 3) + $offset) * 3, $year), $year);
            break;
        case 'year':
            $time = $position ? mktime(0, 0, 0, 1, 1, $year + $offset) : mktime(23, 59, 59, 12, 31, $year + $offset);
            break;
        default:
            $time = mktime($hour, $minute, 0, $month, $day, $year);
            break;
    }
    return $time;
}

学习
记录

发布
问题

分享
好友

手机
浏览

扫码手机浏览