我来为您创建一个功能比较完整的 PHP 日期助手类,包含常用的日期处理功能:

<?php
class DateHelper
{
/**
* 格式化日期
* @param string|int $date 日期字符串或时间戳
* @param string $format 格式
* @return string
*/
public static function format($date = null, $format = 'Y-m-d H:i:s')
{
if (is_numeric($date)) {
return date($format, $date);
}
if (empty($date)) {
return date($format);
}
return date($format, strtotime($date));
}
/**
* 获取当前时间戳
* @return int
*/
public static function timestamp()
{
return time();
}
/**
* 获取当前日期时间
* @param string $format
* @return string
*/
public static function now($format = 'Y-m-d H:i:s')
{
return date($format);
}
/**
* 日期加减
* @param string $date 日期
* @param int $days 天数
* @param string $format 格式
* @return string
*/
public static function addDays($date, $days, $format = 'Y-m-d')
{
$timestamp = strtotime($date);
$newTimestamp = strtotime("+{$days} days", $timestamp);
return date($format, $newTimestamp);
}
/**
* 日期加月
* @param string $date 日期
* @param int $months 月数
* @param string $format 格式
* @return string
*/
public static function addMonths($date, $months, $format = 'Y-m-d')
{
$timestamp = strtotime($date);
$newTimestamp = strtotime("+{$months} months", $timestamp);
return date($format, $newTimestamp);
}
/**
* 日期加年
* @param string $date 日期
* @param int $years 年数
* @param string $format 格式
* @return string
*/
public static function addYears($date, $years, $format = 'Y-m-d')
{
$timestamp = strtotime($date);
$newTimestamp = strtotime("+{$years} years", $timestamp);
return date($format, $newTimestamp);
}
/**
* 获取两个日期之间的天数差
* @param string $date1
* @param string $date2
* @return int
*/
public static function diffInDays($date1, $date2)
{
$timestamp1 = strtotime($date1);
$timestamp2 = strtotime($date2);
$diff = abs($timestamp1 - $timestamp2);
return floor($diff / (60 * 60 * 24));
}
/**
* 获取两个日期之间的完整天数差(向下取整)
* @param string $date1
* @param string $date2
* @return int
*/
public static function diffInWholeDays($date1, $date2)
{
$timestamp1 = strtotime(date('Y-m-d', strtotime($date1)));
$timestamp2 = strtotime(date('Y-m-d', strtotime($date2)));
$diff = ($timestamp1 - $timestamp2) / (60 * 60 * 24);
return (int)$diff;
}
/**
* 获取两个日期之间的月数差异
* @param string $date1
* @param string $date2
* @return int
*/
public static function diffInMonths($date1, $date2)
{
$timestamp1 = strtotime($date1);
$timestamp2 = strtotime($date2);
$year1 = date('Y', $timestamp1);
$year2 = date('Y', $timestamp2);
$month1 = date('n', $timestamp1);
$month2 = date('n', $timestamp2);
return ($year2 - $year1) * 12 + ($month2 - $month1);
}
/**
* 获取相对时间(如:3分钟前,2小时前)
* @param string|int $date
* @return string
*/
public static function relativeTime($date)
{
$timestamp = is_numeric($date) ? $date : strtotime($date);
$diff = time() - $timestamp;
$periods = [
'秒前' => 1,
'分钟前' => 60,
'小时前' => 3600,
'天前' => 86400,
'周前' => 604800,
'月前' => 2592000,
'年前' => 31536000
];
foreach ($periods as $period => $seconds) {
if ($diff < $seconds) {
return $diff . $period;
}
}
return date('Y-m-d H:i:s', $timestamp);
}
/**
* 判断是否为有效日期
* @param string $date
* @return bool
*/
public static function isValid($date)
{
if (empty($date)) return false;
try {
$timestamp = strtotime($date);
if ($timestamp === false) return false;
// 检查日期格式
$formattedDate = date('Y-m-d', $timestamp);
$originalDate = date('Y-m-d', strtotime($date));
return $formattedDate === $originalDate;
} catch (Exception $e) {
return false;
}
}
/**
* 获取日期的开始时间
* @param string $date
* @return string
*/
public static function startOfDay($date = null)
{
$timestamp = $date ? strtotime($date) : time();
return date('Y-m-d 00:00:00', $timestamp);
}
/**
* 获取日期的结束时间
* @param string $date
* @return string
*/
public static function endOfDay($date = null)
{
$timestamp = $date ? strtotime($date) : time();
return date('Y-m-d 23:59:59', $timestamp);
}
/**
* 获取月份开始和结束日期
* @param string $date
* @return array
*/
public static function monthRange($date = null)
{
$timestamp = $date ? strtotime($date) : time();
$start = date('Y-m-01', $timestamp);
$end = date('Y-m-t', $timestamp);
return ['start' => $start, 'end' => $end];
}
/**
* 获取一周的开始和结束日期(周一为开始)
* @param string $date
* @return array
*/
public static function weekRange($date = null)
{
$timestamp = $date ? strtotime($date) : time();
$dayOfWeek = date('N', $timestamp); // 1-7, 周一为1
$start = date('Y-m-d', strtotime('-'.($dayOfWeek - 1).' days', $timestamp));
$end = date('Y-m-d', strtotime('+'.(7 - $dayOfWeek).' days', $timestamp));
return ['start' => $start, 'end' => $end];
}
/**
* 获取最近 N 天的日期列表
* @param int $days 天数
* @param bool $includeToday 是否包含今天
* @return array
*/
public static function recentDays($days = 7, $includeToday = true)
{
$dates = [];
$start = $includeToday ? 0 : 1;
$end = $days - ($includeToday ? 1 : 0);
for ($i = 0; $i < $days; $i++) {
$dates[] = date('Y-m-d', strtotime("-{$i} days"));
}
return $dates;
}
/**
* 获取季度范围
* @param string $date
* @return array
*/
public static function quarterRange($date = null)
{
$timestamp = $date ? strtotime($date) : time();
$month = date('n', $timestamp);
$quarter = ceil($month / 3);
$startMonth = ($quarter - 1) * 3 + 1;
$endMonth = $quarter * 3;
$start = date('Y-m-01', mktime(0, 0, 0, $startMonth, 1, date('Y', $timestamp)));
$end = date('Y-m-t', mktime(0, 0, 0, $endMonth, 1, date('Y', $timestamp)));
return ['start' => $start, 'end' => $end];
}
/**
* 获取星期几(中文)
* @param string $date
* @return string
*/
public static function dayOfWeek($date = null)
{
$timestamp = $date ? strtotime($date) : time();
$days = ['日', '一', '二', '三', '四', '五', '六'];
return $days[date('w', $timestamp)];
}
/**
* 获取两个日期之间的所有日期
* @param string $startDate
* @param string $endDate
* @return array
*/
public static function dateRange($startDate, $endDate)
{
$dates = [];
$start = strtotime($startDate);
$end = strtotime($endDate);
while ($start <= $end) {
$dates[] = date('Y-m-d', $start);
$start = strtotime('+1 day', $start);
}
return $dates;
}
/**
* 人性化日期显示
* @param string $date
* @return string
*/
public static function humanize($date)
{
$timestamp = strtotime($date);
$diff = time() - $timestamp;
if ($diff < 60) {
return $diff . '秒前';
} elseif ($diff < 3600) {
return floor($diff / 60) . '分钟前';
} elseif ($diff < 86400) {
return floor($diff / 3600) . '小时前';
} elseif ($diff < 604800) {
return floor($diff / 86400) . '天前';
} elseif ($diff < 2592000) {
return floor($diff / 604800) . '周前';
} else {
return date('Y-m-d H:i', $timestamp);
}
}
/**
* 获取日期的时间戳
* @param string $date
* @return int
*/
public static function toTimestamp($date)
{
return strtotime($date);
}
/**
* 检查日期是否在范围内
* @param string $date 要检查的日期
* @param string $startDate 开始日期
* @param string $endDate 结束日期
* @return bool
*/
public static function isInRange($date, $startDate, $endDate)
{
$timestamp = strtotime($date);
$start = strtotime($startDate);
$end = strtotime($endDate);
return $timestamp >= $start && $timestamp <= $end;
}
}
// 使用示例
/*
// 格式化日期
echo DateHelper::format(); // 当前时间
echo DateHelper::format('2024-01-15');
echo DateHelper::format(1705315200);
// 日期计算
echo DateHelper::addDays('2024-01-01', 10); // 2024-01-11
echo DateHelper::addMonths('2024-01-01', 2); // 2024-03-01
echo DateHelper::addYears('2024-01-01', 1); // 2025-01-01
// 日期差
echo DateHelper::diffInDays('2024-01-01', '2024-01-10'); // 9
echo DateHelper::diffInMonths('2023-01-01', '2024-03-01'); // 14
// 相对时间
echo DateHelper::relativeTime(time() - 300); // 5分钟前
// 范围获取
print_r(DateHelper::weekRange());
print_r(DateHelper::monthRange());
// 其他功能
echo DateHelper::dayOfWeek('2024-01-15'); // 一
print_r(DateHelper::dateRange('2024-01-01', '2024-01-05'));
*/
?>
这个日期助手类提供了以下主要功能:
- 基础功能:格式化、时间戳转换
- 日期计算:加减天数/月数/年数
- 日期比较:计算日期差(天/月)
- 范围获取:周/月/季度范围
- 人性化:相对时间、中文星期
- 工具方法:有效性验证、日期范围生成
使用方式:
// 直接调用静态方法
echo DateHelper::format();
echo DateHelper::addDays('2024-01-01', 10);
您可以根据实际需求调整或扩展这些方法。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播