winter/modules/system/helpers/DateTime.php
Samuel Georges 6b916cb554 Adds a timetense list column, inspired by FB
Also added |time_since and |time_tense Twig filters
2015-09-17 05:15:12 +10:00

81 lines
2.0 KiB
PHP

<?php namespace System\Helpers;
use Lang;
use Carbon\Carbon;
use Exception;
use DateTime as PhpDateTime;
class DateTime
{
use \October\Rain\Support\Traits\Singleton;
/**
* Returns a human readable time difference from the value to the
* current time. Eg: **10 minutes ago**
*
* @return string
*/
public static function timeSince($datetime)
{
return self::instance()
->makeCarbon($datetime)
->diffForHumans()
;
}
/**
* Returns 24-hour time and the day using the grammatical tense
* of the current time. Eg: Today at 12:49, Yesterday at 4:00
* or 18 Sep 2015 at 14:33.
*
* @return string
*/
public static function timeTense($datetime)
{
$datetime = self::instance()->makeCarbon($datetime);
$yesterday = $datetime->subDays(1);
$tomorrow = $datetime->addDays(1);
$time = $datetime->format('H:i');
$date = $datetime->format('j M Y');
if ($datetime->isToday()) {
$date = 'Today';
}
elseif ($datetime->isYesterday()) {
$date = 'Yesterday';
}
elseif ($datetime->isTomorrow()) {
$date = 'Tomorrow';
}
return $date.' at '.$time;
}
/**
* Converts mixed inputs to a Carbon object.
*
* @return Carbon\Carbon
*/
public function makeCarbon($value, $throwException = true)
{
if ($value instanceof Carbon) {
// Do nothing
}
elseif ($value instanceof PhpDateTime) {
$value = Carbon::instance($value);
}
elseif (is_numeric($value)) {
$value = Carbon::createFromTimestamp($value);
}
elseif (preg_match('/^(\d{4})-(\d{2})-(\d{2})$/', $value)) {
$value = Carbon::createFromFormat('Y-m-d', $value)->startOfDay();
}
if (!$value instanceof Carbon && $throwException) {
throw new Exception('Invalid date value supplied to DateTime helper.');
}
return $value;
}
}