. */ declare(strict_types=1); namespace App\DataTables\Column; use DateTime; use DateTimeInterface; use Exception; use IntlDateFormatter; use Locale; use Omines\DataTablesBundle\Column\AbstractColumn; use Symfony\Component\OptionsResolver\OptionsResolver; /** * Similar to the built in DateTimeColumn, but the datetime is formatted using a IntlDateFormatter, * to get prettier locale based formatting. */ class LocaleDateTimeColumn extends AbstractColumn { /** * @param $value * @return string * @throws Exception */ public function normalize($value): string { if (null === $value) { return $this->options['nullValue']; } elseif (!$value instanceof DateTimeInterface) { $value = new DateTime((string) $value); } $formatValues = [ 'none' => IntlDateFormatter::NONE, 'short' => IntlDateFormatter::SHORT, 'medium' => IntlDateFormatter::MEDIUM, 'long' => IntlDateFormatter::LONG, 'full' => IntlDateFormatter::FULL, ]; $formatter = IntlDateFormatter::create( Locale::getDefault(), $formatValues[$this->options['dateFormat']], $formatValues[$this->options['timeFormat']], null ); //For the tooltip text $long_formatter = IntlDateFormatter::create( Locale::getDefault(), IntlDateFormatter::FULL, IntlDateFormatter::LONG, null ); return sprintf('%s', $long_formatter->format($value->getTimestamp()), //Long form $formatter->format($value->getTimestamp()) //Short form ); } protected function configureOptions(OptionsResolver $resolver): self { parent::configureOptions($resolver); $resolver ->setDefaults([ 'dateFormat' => 'short', 'timeFormat' => 'short', 'nullValue' => '', ]) ->setAllowedTypes('nullValue', 'string') ; return $this; } }