This is not full implementation of features from CLDR. These are missing: - support for other calendars than Gregorian - rules for displaying timezone names are simplified - some less frequently used format characters are not supported
Inheritance: implements Neos\Flow\I18n\Formatter\FormatterInterface
 /**
  * Render the supplied DateTime object as a formatted date.
  *
  * @param mixed $date either a \DateTime object or a string that is accepted by \DateTime constructor
  * @param string $format Format String which is taken to format the Date/Time if none of the locale options are set.
  * @param string $localeFormatType Whether to format (according to locale set in $forceLocale) date, time or datetime. Must be one of Neos\Flow\I18n\Cldr\Reader\DatesReader::FORMAT_TYPE_*'s constants.
  * @param string $localeFormatLength Format length if locale set in $forceLocale. Must be one of Neos\Flow\I18n\Cldr\Reader\DatesReader::FORMAT_LENGTH_*'s constants.
  * @param string $cldrFormat Format string in CLDR format (see http://cldr.unicode.org/translation/date-time)
  * @throws ViewHelperException
  * @return string Formatted date
  * @api
  */
 public function render($date = null, $format = 'Y-m-d', $localeFormatType = null, $localeFormatLength = null, $cldrFormat = null)
 {
     if ($date === null) {
         $date = $this->renderChildren();
         if ($date === null) {
             return '';
         }
     }
     if (!$date instanceof \DateTimeInterface) {
         try {
             $date = new \DateTime($date);
         } catch (\Exception $exception) {
             throw new ViewHelperException('"' . $date . '" could not be parsed by \\DateTime constructor.', 1241722579, $exception);
         }
     }
     $useLocale = $this->getLocale();
     if ($useLocale !== null) {
         try {
             if ($cldrFormat !== null) {
                 $output = $this->datetimeFormatter->formatDateTimeWithCustomPattern($date, $cldrFormat, $useLocale);
             } else {
                 $output = $this->datetimeFormatter->format($date, $useLocale, array($localeFormatType, $localeFormatLength));
             }
         } catch (I18nException $exception) {
             throw new ViewHelperException(sprintf('An error occurred while trying to format the given date/time: "%s"', $exception->getMessage()), 1342610987, $exception);
         }
     } else {
         $output = $date->format($format);
     }
     return $output;
 }
 /**
  * @test
  * @dataProvider sampleDataForSpecificFormattingMethods
  */
 public function specificFormattingMethodsWork(array $parsedFormat, $expectedResult, $formatType)
 {
     $formatLength = I18n\Cldr\Reader\DatesReader::FORMAT_LENGTH_FULL;
     $mockDatesReader = $this->createMock(I18n\Cldr\Reader\DatesReader::class);
     $mockDatesReader->expects($this->once())->method('parseFormatFromCldr')->with($this->sampleLocale, $formatType, $formatLength)->will($this->returnValue($parsedFormat));
     $mockDatesReader->expects($this->once())->method('getLocalizedLiteralsForLocale')->with($this->sampleLocale)->will($this->returnValue($this->sampleLocalizedLiterals));
     $formatter = new I18n\Formatter\DatetimeFormatter();
     $formatter->injectDatesReader($mockDatesReader);
     $methodName = 'format' . ucfirst($formatType);
     $result = $formatter->{$methodName}($this->sampleDateTime, $this->sampleLocale, $formatLength);
     $this->assertEquals($expectedResult, $result);
 }