PHP 时间函数
会员活动 循环获取会员日时间
会员活动 循环获取会员日时间并且返回最近一次会员日时间
if (!function_exists('get_circulate_timestamp')) {
function get_circulate_timestamp($dates, $date_type, $reference_timestamp)
{
$timestamp_array = [];
$format = '';
switch ($date_type) {
case 1:
$format = 'Y-';
break;
case 2:
$format = 'Y-m-';
break;
case 3:
$week = date("w", $reference_timestamp);
if ($week == 0) {
$week = 7;
}
$current_time = strtotime(date("Y-m-d", $reference_timestamp));
break;
default:
return [];
}
foreach ($dates as $date_info) {
switch ($date_type) {
case 1:
case 2:
$timestamp_array[] = strtotime($format . $date_info);
break;
case 3:
$timestamp_array[] = $current_time + ($date_info - $week) * 86400;
break;
}
}
return $timestamp_array;
}
}
if (!function_exists('get_time_array')) {
function get_time_array($dates, $date_type, $reference_timestamp, $compare_timestamp)
{
$timestamp_array = get_circulate_timestamp($dates, $date_type, $reference_timestamp);
$time_array = ['next_begin' => 0, 'nearest_begin' => 0];
foreach ($timestamp_array as $timestamp) {
if ($timestamp > $compare_timestamp) {
$time_array['next_begin'] = ($time_array['next_begin'] == 0 || $timestamp < $time_array['next_begin']) ? $timestamp : $time_array['next_begin'];
}
if ($timestamp <= $compare_timestamp) {
$time_array['nearest_begin'] = ($time_array['nearest_begin'] == 0 || $timestamp > $time_array['nearest_begin']) ? $timestamp : $time_array['nearest_begin'];
}
}
return $time_array;
}
}
获取日周月年 时间段时间戳
获取当前 日/周/月/年 起始和结束时间戳
获取前一 日/周/月/年 起始和结束时间戳
function get_period_timestamp($start_time, $period_type = 'daily')
{
switch ($period_type) {
case 'daily':
//所选时间的昨天起始
$before_begin = date('Y-m-d 00:00:00', strtotime('-1 day', $start_time));
$before_end = date('y-m-d 23:59:59', strtotime($before_begin));
//所选时间的一天起始
$begin = strtotime(date('Y-m-d', $start_time));
$end = strtotime(date('Y-m-d 23:59:59', $start_time));
break;
case 'weekly':
//上周一
if (date('w') == 1) {
$before_begin = date('Y-m-d', strtotime('last monday', $start_time)); //无论今天几号,-1 monday为上一个有效周
} else {
$before_begin = date('Y-m-d', strtotime('-1 week last monday', $start_time)); //无论今天几号,-1 monday为上一个有效周
}
//上周日
$before_end = date('Y-m-d 23:59:59', strtotime('-1 sunday', $start_time)); //上一个有效周日,同样适用于其它星期
//本周一
// $begin = date('Y-m-d', ($start_time - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)); //w为星期几的数字形式,这里0为周日
$begin = date('Y-m-d', strtotime('this week Monday', $start_time));
$end = date('Y-m-d', strtotime('+1week', $begin)) - 1;
break;
case 'month':
//上月一日
$before_begin = date('Y-m-d', strtotime('-1 month', strtotime(date('Y-m', $start_time) . '-01 00:00:00'))); //本月一日直接strtotime上减一个月
//上月最后一日
$before_end = date('Y-m-d 23:59:59', strtotime(date('Y-m', $start_time) . '-01 00:00:00') - 86400); //本月一日减一天即是上月最后一日
//所选时间的月起始
$begin = date('Y-m-d', strtotime(date('Y-m', $start_time) . '-01 00:00:00')); //直接以strtotime生成
$begin = date('Y-m-d', strtotime(date('Y-m-01', $start_time)));
$end = date('Y-m-d', strtotime('+1month', $begin)) - 1;
break;
case 'year':
//去年一月一日
$before_begin = date('Y-m-d', strtotime('-1 year', strtotime(date('Y', $start_time) . '-01-01 00:00:00'))); //本月一日直接strtotime上减一个月
//去年十二月三十一日
$before_end = date('Y-m-d 23:59:59', strtotime(date('Y', $start_time) . '-01-01 00:00:00') - 1); //本月一日减一天即是上月最后一日
//所选时间的年起始\
$begin = date('Y-m-d', strtotime(date('Y-01-01', $start_time)));
$end = date('Y-m-d', strtotime('+1year', $begin)) - 1;
break;
default:
return build_result('类型错误 :daily,weekly,month,year');
}
$result = [
'before_begin' => $before_begin,
'before_end' => $before_end,
'begin' => $begin,
'end' => $end
];
return build_result('查询成功', 0, $result);
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
改进后
function get_period_timestamp($start_time, $period_type = 'daily')
{
switch ($period_type) {
case "daily":
//所选时间的昨天起始
$before_begin = date("Y-m-d 00:00:00", strtotime("-1 day", $start_time));
$before_end = date("y-m-d 23:59:59", strtotime($before_begin));
//所选时间的一天起始
$begin = strtotime(date("Y-m-d", $start_time));
$end = strtotime(date("Y-m-d 23:59:59", $start_time));
break;
case "weekly":
//上周一
if (date("w") == 1) {
$before_begin = date("Y-m-d", strtotime("last monday", $start_time)); //无论今天几号,-1 monday为上一个有效周
} else {
$before_begin = date("Y-m-d", strtotime("-1 week last monday", $start_time)); //无论今天几号,-1 monday为上一个有效周
}
//上周日
$before_end = date("Y-m-d 23:59:59", strtotime("-1 sunday", $start_time)); //上一个有效周日,同样适用于其它星期
//本周一
// $begin = date("Y-m-d", ($start_time - ((date("w") == 0 ? 7 : date("w")) - 1) 24 3600)); //w为星期几的数字形式,这里0为周日
$begin = date("Y-m-d", strtotime("this week Monday", $start_time));
$end = date("Y-m-d", strtotime('+1week', $begin)) - 1;
break;
case "month":
//上月一日
$before_begin = date("Y-m-d",strtotime("first day of -1 month",$start_time));
//上月最后一日
$before_end = date("Y-m-d 23:59:59",strtotime("last day of -1 month",$start_time));
//所选时间的月起始
$begin = date("Y-m-d", strtotime(date("Y-m", $start_time) . "-01 00:00:00")); //直接以strtotime生成
$begin = date("Y-m-d", strtotime(date("Y-m-01", $start_time)));
$end = date("Y-m-d", strtotime('+1month', $begin)) - 1;
break;
case "year":
//去年一月一日
$before_begin = date("Y-m-d", strtotime("-1 year", strtotime(date("Y", $start_time) . '-01-01 00:00:00'))); //本月一日直接strtotime上减一个月
//去年十二月三十一日
$before_end = date("Y-m-d 23:59:59", strtotime(date("Y", $start_time) ."-01-01 00:00:00") - 1); //本月一日减一天即是上月最后一日
//所选时间的年起始
$begin = date("Y-m-d", strtotime(date("Y-01-01", $start_time)));
$end = date("Y-m-d", strtotime('+1year', $begin)) - 1;
break;
default:
return build_result('类型错误 :daily,weekly,month,year');
}
$result = [
"before_begin" => $before_begin,
"before_end" => $before_end,
"begin" => $begin,
"end" => $end
];
return build_result('查询成功', 0, $result);
}
这代码看到头皮发麻
抛开逻辑不谈;需要优化的两点: 1、字符串既有单引号的,也有双引号的。 2、硬编码数字(如:1、2、3、...),最好是单独定义成释义的常量。
用到strtotime最好看看鸟哥的这篇文章
www.laruence.com/2018/07/31/3207.h...