wookieb/relative-date

一个完全可配置的工具,用于计算并显示日期差异,以人类可读的形式显示,例如“2分钟前”或“10分钟之后”。

0.1 2016-07-24 20:12 UTC

This package is not auto-updated.

Last update: 2024-09-26 02:21:04 UTC


README

一个帮助您计算关于日期的人类可读信息的库。

这特别适用于以下情况:

  • 计算时间过去 - “2秒前”,“昨天”
  • 计算未来的时间 - “5秒内”,“明天14:00”(进行中)”

功能

  • 可定制的规则和预定义规则(查看计算器
  • 智能的“昨天”和“明天”计算
  • 支持翻译或任何其他客户格式化程序
  • 通过relative-date-bundle与Symfony 2和3集成

安装

composer require wookieb/relative-date

使用方法

$formatter = new Wookieb\RelativeDate\Formatters\BasicFormatter();
// You can pick one of calculators. See "calculators" section for details
$calculator = Wookieb\RelativeDate\Calculators\TimeAgoDateDiffCalculator::full();

$date = new \DateTime('2016-01-01 14:00:00');
$now = new \DateTime('2016-01-01 16:00:00'); // not required, defaults to current date
$formatter->format($calculator->compute($date, $now)); // 2 hours ago

原理

我创建这个库是因为我对成百上千的非常简单的相对日期计算器感到厌倦,这些计算器根据非常严格、不可变的原则计算结果。这就是为什么relative-date由可以重新定义整个相对日期计算逻辑的部分组成,以完全满足您的需求。

如果您不需要“2年前”的结果,因为大多数情况下它毫无用处?请随意选择“upTo2Weeks”计算器,并得到您所需的确切结果!

翻译和支持不同语言

通过TranslatorFormatter支持翻译。

Symfony用户应使用relative-date-bundle

// $translator - get Symfony translator somehow 
$formatter = new Wookieb\RelativeDate\Formatters\TranslatorFormatter($translator);
$calculator = Wookieb\RelativeDate\Calculators\TimeAgoDateDiffCalculator::full();

$date = new \DateTime('2016-01-01 14:00:00');
$now = new \DateTime('2016-01-01 16:00:00');
$formatter->format($calculator->compute($date, $now)); // 2 godziny temu

计算器

TimeAgoCalculator::full

在以下单位之一中计算结果

  • 分钟
  • 小时

TimeAgoCalculator::upTo2Weeks

在以下单位之一中计算结果

  • 分钟
  • "昨天"
  • 小时
  • 周(最多14天)
  • 完整日期(如果日期早于14天)

TimeAgoCalculator::upTo2Days

在以下单位之一中计算结果

  • 分钟
  • "昨天"
  • 小时
  • 完整日期(如果日期早于“昨天”)

定制

翻译器和自定义占位符

默认情况下,TranslatorFormatter只为您的翻译定义了一个占位符“%count%”。您可以定义自定义的,特别适用于更详细的最终输出。

$translator = new TranslatorFormatter($translator);
$translator->registerCustomPlaceholder(
    ['yesterday', 'tomorrow'], // applies only to specific result key names
    '%at%', // placeholder name
    function(DateDiffResult $result) {
        return $result->getRequest()
            ->getDate()
            ->format('H:i');
    }
);

// translation definition
tomorrow: tomorrow at %at%

// usage
$date = new \DateTime('2016-01-01 14:05:00');
$baseDate = new \DateTime('2016-01-02 00:00:00');
$result = $translator->format(TimeAgoCalculator::upTo2Weeks()->compute($date, $baseDate));
$result; // yesterday at 14:05

自定义完整日期格式

每个内置Formatter都支持应用于表示完整日期的结果的日期格式字符串。

$format = Wookieb\RelativeDate\Formatters\BasicFormatter::SHORT_FORMAT; // Y-m-d
$formatter = new Wookieb\RelativeDate\Formatters\BasicFormatter($format);
$calculator = Wookieb\RelativeDate\Calculators\TimeAgoDateDiffCalculator::upTo2Weeks();

$date = new \DateTime('2016-01-01 14:00:00');
$now = new \DateTime('2016-03-01 16:00:00');
$formatter->format($calculator->compute($date, $now)); // 2016-01-01
```