Stars: 565
Forks: 107
Pull Requests: 155
Issues: 45
Watchers: 36
Last Updated: 2023-09-07 14:34:05
Friendly ago/until dates ("5 minutes ago" or "in 5 minutes") and durations ("2 mins")!
Last edited: {{ post.updatedAt|time_diff }} <!-- Last edited: 1 week ago -->
Event date: {{ event.date|time_diff }} <!-- Event date: in two weeks -->
Read time: {{ post.readTimeInSeconds|duration }} <!-- Read time: 2 minutes -->
Age: {{ user.birthdate|age }} <!-- Age: 30 years old -->
Want to see it used in a screencast 🎥? Check out SymfonyCasts: https://symfonycasts.com/screencast/symfony-doctrine/ago
The formatted date/duration can be translated into any language, and many are supported out of the box.
Use Composer to install the library:
composer require knplabs/knp-time-bundle
Woo! You did it! Assuming your project uses Symfony Flex, the
bundle should be configured and ready to go. If not, you
can enable Knp\Bundle\TimeBundle\KnpTimeBundle
manually.
Time formatting:
{{ someDateTimeVariable|time_diff }} {# 2 weeks ago #}
{# |ago is an alias for |time_diff #}
{{ someDateTimeVariable|ago }} {# 1 second ago #}
{# ... or use the equivalent function: #}
{{ time_diff(someDateTimeVariable) }} {# in 2 months #}
Note: the
time_diff
filter/function andago
alias works fine for dates in the future, too.
Duration formatting:
{{ someDurationInSeconds|duration }} {# 2 minutes #}
Age formatting:
{# with filter: #}
Age: {{ user.birthdate|age }} {# Age: 30 years old #}
{# ... or use the equivalent function: #}
Age: {{ age(user.birthdate) }} {# Age: 30 years old #}
You can also format dates and durations in your services/controllers by autowiring/injecting the
Knp\Bundle\TimeBundle\DateTimeFormatter
service:
use Knp\Bundle\TimeBundle\DateTimeFormatter;
// ...
public function yourAction(DateTimeFormatter $dateTimeFormatter)
{
$someDate = new \DateTimeImmutable('-2 years'); // or $entity->publishedDate()
$toDate = new \DateTimeImmutable('now');
$agoTime = $dateTimeFormatter->formatDiff($someDate, $toDate); // $toDate parameter is optional and defaults to "now"
$readTime = $dateTimeFormatter->formatDuration(64); // or $entity->readTimeInSeconds()
$ageTime = $dateTimeFormatter->formatAge($someDate, $toDate); // $toDate parameter is optional and defaults to "now"
return $this->json([
// ...
'published_at' => $agoTime, // 2 years ago
'read_time' => $readTime, // 1 minute
// ...
]);
}
The bundle will automatically use the current locale when translating the "time_diff" ("ago") and "duration" messages. However, you can override the locale:
{{ someDateTimeVariable|time_diff(locale='es') }}
{{ someDurationInSeconds|duration(locale='es') }}
{{ someDateTimeVariable|age(locale='es') }}
If you want to run tests, please check that you have installed dev dependencies.
./vendor/bin/phpunit
Anyone can contribute to this repository (and it's warmly welcomed!). The following people maintain and can merge into this library: