主页/PHP笔记/PHP问答/基础应用/PHP:将日期时间转换为“时间前”格式及反向转换

PHP:将日期时间转换为“时间前”格式及反向转换

介绍

处理日期和时间在许多PHP应用中都是常见需求。无论是开发社交网络、博客平台还是个人项目,显示相对时间(如“2分钟前”或将此类短语转换回标准化的日期时间)对于提升用户体验非常有用。本教程将指导您通过各种PHP函数和技术轻松实现这些转换。

将日期时间转换为距今多久。

将特定日期和时间转换为“多长时间以前”的格式,例如“秒以前”、“分钟以前”等,可以让用户感受到事件发生的时间距离。以下是一个示例,展示如何创建一个简单的PHP函数来执行此转换:

function timeAgo($datetime) {
    $time = strtotime($datetime);
    $diff = time() - $time;

    if ($diff < 60) {
        return 'Just now';
    }

    $timeRules = [
        ['minute', 60],
        ['hour', 3600],
        ['day', 86400],
        ['week', 604800],
        ['month', 2592000],
        ['year', 31536000],
    ];

    foreach ($timeRules as $rule) {
        $divided = $diff / $rule[1];
        if ($divided >= 1) {
            $r = round($divided);
            return $r . ' ' . ($r > 1 ? $rule[0].'s' : $rule[0]) . ' ago';
        }
    }
}

这个功能接受一个日期时间字符串作为输入,计算当前时间和提供的时间之间的差值,并以可读的“多长时间以前”格式显示。

将“Time Ago”转换为日期时间。

在显示“一段时间前”很有帮助,但在某些情况下,你需要将其转换回标准日期和时间格式。以下示例展示了这一转换过程:

function timeAgoToDate($timeAgo) {
    $currentTime = time();
    $timeAgo = strtolower($timeAgo);

    $deconstructed = sscanf($timeAgo, '%d %s ago', $value, $unit);
    if($deconstructed < 2) {
        // Handle error
        return null;
    }

    $unitsToSeconds = [
        'second' => 1,
        'minute' => 60,
        'hour'   => 3600,
        'day'    => 86400,
        'week'   => 604800,
        'month'  => 2592000,
        'year'   => 31536000,
    ];

    if (isset($unitsToSeconds[$unit]) || isset($unitsToSeconds[$unit.'s'])) {
        $unit = rtrim($unit, 's');
        $secondsAgo = $value * $unitsToSeconds[$unit];
        $date = date('Y-m-d H:i:s', $currentTime - $secondsAgo);
        return $date;
    }    

    return null;
}

在该功能中,我们将类似于“3天前”的字符串提取出数字值和时间单位,然后从当前时间减去相应的时间来获取原始日期和时间。

利用DateTime类

PHP的DateTime类提供了日期和时间操作的对象化方式。以下是一个使用DateTime转换日期时间到过去多久和过去多久到DateTime的例子:

// DateTime to Time Ago
function dateTimeToTimeAgo(Datetime $datetime) {
    // Code similar to the above timeAgo function
}

// Time Ago to DateTime
function timeAgoToDateTime($timeAgo) {
    // Code similar to the above timeAgoToDate function
}

使用DateTime类可以提供更多灵活性、时区支持以及通过内置方法实现更好的错误处理。

处理本地化和时区问题

处理来自不同地区的用户需要考虑在转换时间时进行本地化和时区的考量。我们可以使用DateTimeZone和IntlDateFormatter来解决这些问题:

// Convert to localized time ago
function localizedTimeAgo(DateTime $datetime, $locale) {
    // Localization example
}

// Convert localized time ago back to DateTime
function localizedTimeAgoToDateTime($timeAgo, $timezone) {
    // Conversion example, with time zone support
}

本高级部分演示了如何为我们的早期功能进行定制,以考虑各种语言和时区。

结论。

时间相关的转换在创建友好的用户体验方面对于PHP应用程序至关重要。我们已经探讨了从基本到高级的日期和时间格式化技术,以及相反方向的转换方法。通过理解PHP的日期和时间函数,以及实施现代面向对象的概念如DateTime和DateTimeZone类,您可以轻松处理项目中的时间操作。