即时消息接口完结
This commit is contained in:
@@ -141,16 +141,60 @@ function simple_decrypt(string $ciphertext, string $key): string|false
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 微信风格时间格式化(仅用原生 date/strtotime 函数,周一为一周起点)
|
||||
* @param string $inputTime 输入时间字符串(支持:Y-m-d H:i:s、timestamp、Y-m-d 等)
|
||||
* @param string $timezone 时区(默认北京时间,原生函数依赖服务器时区,建议提前配置)
|
||||
* @return string 格式化结果(如:09:11、昨天 15:30、周一 10:20、11-16 08:05、2024-05-20 14:30)
|
||||
*/
|
||||
function formatWeChatTime(string $inputTime, string $timezone = 'Asia/Shanghai'): string
|
||||
{
|
||||
// 1. 配置时区(原生函数需手动设置,避免服务器时区差异)
|
||||
date_default_timezone_set($timezone);
|
||||
|
||||
// 2. 转换目标时间为时间戳(兼容多种输入格式)
|
||||
$targetTimestamp = strtotime($inputTime);
|
||||
if ($targetTimestamp === false) {
|
||||
error_log('无效时间格式:' . $inputTime);
|
||||
return $inputTime; // 无效时间返回原始值
|
||||
}
|
||||
|
||||
// 3. 计算关键时间边界的时间戳(原生函数核心)
|
||||
$nowTimestamp = time(); // 当前时间戳
|
||||
$todayStart = strtotime('today'); // 今天 00:00:00(等价于 mktime(0,0,0,date('m'),date('d'),date('Y')))
|
||||
$yesterdayStart = strtotime('yesterday'); // 昨天 00:00:00(today - 86400)
|
||||
$currentWeekDay = date('N', $todayStart); // 今天是本周第几天(1=周一,7=周日)
|
||||
$mondayStart = strtotime("-$currentWeekDay days +1 day", $todayStart); // 本周一 00:00:00
|
||||
$yearStart = strtotime(date('Y') . '-01-01 00:00:00'); // 今年 1月1日 00:00:00
|
||||
|
||||
// 4. 周几映射(date('N') 返回 1-7 → 对应周一-周日)
|
||||
$weekMap = [1 => '周一', 2 => '周二', 3 => '周三', 4 => '周四', 5 => '周五', 6 => '周六', 7 => '周日'];
|
||||
|
||||
// 5. 按优先级判断场景(从近到远)
|
||||
// 场景1:今天(>= 今天0点)
|
||||
if ($targetTimestamp >= $todayStart) {
|
||||
return date('H:i', $targetTimestamp);
|
||||
}
|
||||
|
||||
// 场景2:昨天(>= 昨天0点 且 < 今天0点)
|
||||
if ($targetTimestamp >= $yesterdayStart && $targetTimestamp < $todayStart) {
|
||||
return '昨天 ' . date('H:i', $targetTimestamp);
|
||||
}
|
||||
|
||||
// 场景3:本周内(>= 本周一0点 且 < 今天0点)→ 显示周几+时间
|
||||
if ($targetTimestamp >= $mondayStart && $targetTimestamp < $todayStart) {
|
||||
$targetWeekDay = date('N', $targetTimestamp); // 目标时间的周几
|
||||
return $weekMap[$targetWeekDay] . ' ' . date('H:i', $targetTimestamp);
|
||||
}
|
||||
|
||||
// 场景4:今年内(>= 今年1月1日 且 < 本周一0点)→ 显示月-日+时间
|
||||
if ($targetTimestamp >= $yearStart && $targetTimestamp < $mondayStart) {
|
||||
return date('m-d H:i', $targetTimestamp);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 场景5:去年及以前(< 今年1月1日)→ 显示完整日期+时间
|
||||
return date('Y-m-d H:i', $targetTimestamp);
|
||||
}
|
||||
|
||||
/**
|
||||
* 多维数组去重并重新索引
|
||||
|
||||
Reference in New Issue
Block a user