ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
DateFormatter.php
Go to the documentation of this file.
1<?php
2
4
6
8{
14 private static $dateFormatReplacements = [
15 // first remove escapes related to non-format characters
16 '\\' => '',
17 // 12-hour suffix
18 'am/pm' => 'A',
19 // 4-digit year
20 'e' => 'Y',
21 'yyyy' => 'Y',
22 // 2-digit year
23 'yy' => 'y',
24 // first letter of month - no php equivalent
25 'mmmmm' => 'M',
26 // full month name
27 'mmmm' => 'F',
28 // short month name
29 'mmm' => 'M',
30 // mm is minutes if time, but can also be month w/leading zero
31 // so we try to identify times be the inclusion of a : separator in the mask
32 // It isn't perfect, but the best way I know how
33 ':mm' => ':i',
34 'mm:' => 'i:',
35 // month leading zero
36 'mm' => 'm',
37 // month no leading zero
38 'm' => 'n',
39 // full day of week name
40 'dddd' => 'l',
41 // short day of week name
42 'ddd' => 'D',
43 // days leading zero
44 'dd' => 'd',
45 // days no leading zero
46 'd' => 'j',
47 // seconds
48 'ss' => 's',
49 // fractional seconds - no php equivalent
50 '.s' => '',
51 ];
52
58 private static $dateFormatReplacements24 = [
59 'hh' => 'H',
60 'h' => 'G',
61 ];
62
68 private static $dateFormatReplacements12 = [
69 'hh' => 'h',
70 'h' => 'g',
71 ];
72
73 public static function format($value, string $format): string
74 {
75 // strip off first part containing e.g. [$-F800] or [$USD-409]
76 // general syntax: [$<Currency string>-<language info>]
77 // language info is in hexadecimal
78 // strip off chinese part like [DBNum1][$-804]
79 $format = preg_replace('/^(\[DBNum\d\])*(\[\$[^\]]*\])/i', '', $format);
80
81 // OpenOffice.org uses upper-case number formats, e.g. 'YYYY', convert to lower-case;
82 // but we don't want to change any quoted strings
83 $format = preg_replace_callback('/(?:^|")([^"]*)(?:$|")/', ['self', 'setLowercaseCallback'], $format);
84
85 // Only process the non-quoted blocks for date format characters
86 $blocks = explode('"', $format);
87 foreach ($blocks as $key => &$block) {
88 if ($key % 2 == 0) {
89 $block = strtr($block, self::$dateFormatReplacements);
90 if (!strpos($block, 'A')) {
91 // 24-hour time format
92 // when [h]:mm format, the [h] should replace to the hours of the value * 24
93 if (false !== strpos($block, '[h]')) {
94 $hours = (int) ($value * 24);
95 $block = str_replace('[h]', $hours, $block);
96
97 continue;
98 }
99 $block = strtr($block, self::$dateFormatReplacements24);
100 } else {
101 // 12-hour time format
102 $block = strtr($block, self::$dateFormatReplacements12);
103 }
104 }
105 }
106 $format = implode('"', $blocks);
107
108 // escape any quoted characters so that DateTime format() will render them correctly
109 $format = preg_replace_callback('/"(.*)"/U', ['self', 'escapeQuotesCallback'], $format);
110
111 $dateObj = Date::excelToDateTimeObject($value);
112 // If the colon preceding minute had been quoted, as happens in
113 // Excel 2003 XML formats, m will not have been changed to i above.
114 // Change it now.
115 $format = \preg_replace('/\\\\:m/', ':i', $format);
116
117 return $dateObj->format($format);
118 }
119
120 private static function setLowercaseCallback($matches): string
121 {
122 return mb_strtolower($matches[0]);
123 }
124
125 private static function escapeQuotesCallback($matches): string
126 {
127 return '\\' . implode('\\', str_split($matches[1]));
128 }
129}
An exception for terminatinating execution or to throw for unit testing.
static excelToDateTimeObject($excelTimestamp, $timeZone=null)
Convert a MS serialized datetime value from Excel to a PHP Date/Time object.
Definition: Date.php:170
$key
Definition: croninfo.php:18
$format
Definition: metadata.php:141