Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Twig\Helper; | |
use Mautic\CoreBundle\Helper\CoreParametersHelper; | |
use Mautic\CoreBundle\Helper\DateTimeHelper; | |
use Symfony\Contracts\Translation\TranslatorInterface; | |
final class DateHelper | |
{ | |
/** | |
* @var string[] | |
*/ | |
private array $formats; | |
private DateTimeHelper $helper; | |
/** | |
* @param string $dateFullFormat | |
* @param string $dateShortFormat | |
* @param string $dateOnlyFormat | |
* @param string $timeOnlyFormat | |
*/ | |
public function __construct( | |
$dateFullFormat, | |
$dateShortFormat, | |
$dateOnlyFormat, | |
$timeOnlyFormat, | |
private TranslatorInterface $translator, | |
private CoreParametersHelper $coreParametersHelper | |
) { | |
$this->formats = [ | |
'datetime' => $dateFullFormat, | |
'short' => $dateShortFormat, | |
'date' => $dateOnlyFormat, | |
'time' => $timeOnlyFormat, | |
]; | |
$this->helper = new DateTimeHelper('', 'Y-m-d H:i:s', 'local'); | |
} | |
/** | |
* @param string $type | |
* @param \DateTime|string $datetime | |
* @param string $timezone | |
* @param string $fromFormat | |
* | |
* @return string | |
*/ | |
private function format($type, $datetime, $timezone, $fromFormat) | |
{ | |
if (empty($datetime)) { | |
return ''; | |
} else { | |
$this->helper->setDateTime($datetime, $fromFormat, $timezone); | |
return $this->helper->toLocalString( | |
$this->formats[$type] | |
); | |
} | |
} | |
/** | |
* Returns full date. eg. October 8, 2014 21:19. | |
* | |
* @param \DateTime|string $datetime | |
* @param string $timezone | |
* @param string $fromFormat | |
* | |
* @return string | |
*/ | |
public function toFull($datetime, $timezone = 'local', $fromFormat = 'Y-m-d H:i:s') | |
{ | |
return $this->format('datetime', $datetime, $timezone, $fromFormat); | |
} | |
/** | |
* Returns date and time concat eg 2014-08-02 5:00am. | |
* | |
* @param \DateTime|string $datetime | |
* @param string $timezone | |
* @param string $fromFormat | |
* | |
* @return string | |
*/ | |
public function toFullConcat($datetime, $timezone = 'local', $fromFormat = 'Y-m-d H:i:s') | |
{ | |
$this->helper->setDateTime($datetime, $fromFormat, $timezone); | |
return $this->helper->toLocalString( | |
$this->formats['date'].' '.$this->formats['time'] | |
); | |
} | |
/** | |
* Returns short date format eg Sun, Oct 8. | |
* | |
* @param \DateTime|string $datetime | |
* @param string $timezone | |
* @param string $fromFormat | |
* | |
* @return string | |
*/ | |
public function toShort($datetime, $timezone = 'local', $fromFormat = 'Y-m-d H:i:s') | |
{ | |
return $this->format('short', $datetime, $timezone, $fromFormat); | |
} | |
/** | |
* Returns date only e.g. 2014-08-09. | |
* | |
* @param \DateTime|string $datetime | |
* @param string $timezone | |
* @param string $fromFormat | |
* | |
* @return string | |
*/ | |
public function toDate($datetime, $timezone = 'local', $fromFormat = 'Y-m-d H:i:s') | |
{ | |
return $this->format('date', $datetime, $timezone, $fromFormat); | |
} | |
/** | |
* Returns time only e.g. 21:19. | |
* | |
* @param \DateTime|string $datetime | |
* @param string $timezone | |
* @param string $fromFormat | |
* | |
* @return string | |
*/ | |
public function toTime($datetime, $timezone = 'local', $fromFormat = 'Y-m-d H:i:s') | |
{ | |
return $this->format('time', $datetime, $timezone, $fromFormat); | |
} | |
/** | |
* Returns date/time like Today, 10:00 AM. | |
* | |
* @param string|int<min, -1>|int<1, max>|\DateTime $datetime | |
* @param string $timezone | |
* @param string $fromFormat | |
* @param bool $forceDateForNonText If true, return as full date/time rather than "29 days ago" | |
*/ | |
public function toText($datetime, $timezone = 'local', $fromFormat = 'Y-m-d H:i:s', $forceDateForNonText = false): string | |
{ | |
if (empty($datetime)) { | |
return ''; | |
} | |
$this->helper->setDateTime($datetime, $fromFormat, $timezone); | |
$textDate = $this->helper->getTextDate(); | |
$dt = $this->helper->getLocalDateTime(); | |
if ($textDate) { | |
return $this->translator->trans('mautic.core.date.'.$textDate, ['%time%' => $dt->format($this->coreParametersHelper->get('date_format_timeonly'))]); | |
} else { | |
$interval = $this->helper->getDiff('now', null, true); | |
if ($interval->invert && !$forceDateForNonText) { | |
// In the past | |
return $this->translator->trans('mautic.core.date.ago', ['%days%' => $interval->days]); | |
} else { | |
// In the future | |
return $this->toFullConcat($datetime, $timezone, $fromFormat); | |
} | |
} | |
} | |
/** | |
* Format DateInterval into humanly readable format. | |
* Example: 55 minutes 49 seconds. | |
* It doesn't return zero values like 0 years. | |
*/ | |
public function formatRange(\DateInterval $range): string | |
{ | |
$formated = []; | |
$timeUnits = ['y' => 'year', 'm' => 'month', 'd' => 'day', 'h' => 'hour', 'i' => 'minute', 's' => 'second']; | |
foreach ($timeUnits as $key => $unit) { | |
if ($range->{$key}) { | |
$formated[] = $this->translator->trans( | |
'mautic.core.date.'.$unit, | |
['%count%' => $range->{$key}] | |
); | |
} | |
} | |
if (empty($formated)) { | |
return $this->translator->trans('mautic.core.date.less.than.second'); | |
} | |
return implode(' ', $formated); | |
} | |
/** | |
* @return string | |
*/ | |
public function getFullFormat() | |
{ | |
return $this->formats['datetime']; | |
} | |
/** | |
* @return string | |
*/ | |
public function getDateFormat() | |
{ | |
return $this->formats['date']; | |
} | |
/** | |
* @return string | |
*/ | |
public function getTimeFormat() | |
{ | |
return $this->formats['time']; | |
} | |
/** | |
* @return string | |
*/ | |
public function getShortFormat() | |
{ | |
return $this->formats['short']; | |
} | |
public function getName(): string | |
{ | |
return 'date'; | |
} | |
} | |