@@ -26,10 +26,12 @@ class NumberFormat extends Supervisor
2626 const FORMAT_DATE_DMMINUS = 'd-m ' ;
2727 const FORMAT_DATE_MYMINUS = 'm-yy ' ;
2828 const FORMAT_DATE_XLSX14 = 'mm-dd-yy ' ;
29+ const FORMAT_DATE_XLSX14_ACTUAL = 'm/d/yyyy ' ;
2930 const FORMAT_DATE_XLSX15 = 'd-mmm-yy ' ;
3031 const FORMAT_DATE_XLSX16 = 'd-mmm ' ;
3132 const FORMAT_DATE_XLSX17 = 'mmm-yy ' ;
3233 const FORMAT_DATE_XLSX22 = 'm/d/yy h:mm ' ;
34+ const FORMAT_DATE_XLSX22_ACTUAL = 'm/d/yyyy h:mm ' ;
3335 const FORMAT_DATE_DATETIME = 'd/m/yy h:mm ' ;
3436 const FORMAT_DATE_TIME1 = 'h:mm AM/PM ' ;
3537 const FORMAT_DATE_TIME2 = 'h:mm:ss AM/PM ' ;
@@ -40,6 +42,7 @@ class NumberFormat extends Supervisor
4042 const FORMAT_DATE_TIME7 = 'i:s.S ' ;
4143 const FORMAT_DATE_TIME8 = 'h:mm:ss;@ ' ;
4244 const FORMAT_DATE_YYYYMMDDSLASH = 'yyyy/mm/dd;@ ' ;
45+ const FORMAT_DATE_LONG_DATE = 'dddd, mmmm d, yyyy ' ;
4346
4447 const DATE_TIME_OR_DATETIME_ARRAY = [
4548 self ::FORMAT_DATE_YYYYMMDD ,
@@ -49,10 +52,12 @@ class NumberFormat extends Supervisor
4952 self ::FORMAT_DATE_DMMINUS ,
5053 self ::FORMAT_DATE_MYMINUS ,
5154 self ::FORMAT_DATE_XLSX14 ,
55+ self ::FORMAT_DATE_XLSX14_ACTUAL ,
5256 self ::FORMAT_DATE_XLSX15 ,
5357 self ::FORMAT_DATE_XLSX16 ,
5458 self ::FORMAT_DATE_XLSX17 ,
5559 self ::FORMAT_DATE_XLSX22 ,
60+ self ::FORMAT_DATE_XLSX22_ACTUAL ,
5661 self ::FORMAT_DATE_DATETIME ,
5762 self ::FORMAT_DATE_TIME1 ,
5863 self ::FORMAT_DATE_TIME2 ,
@@ -63,6 +68,7 @@ class NumberFormat extends Supervisor
6368 self ::FORMAT_DATE_TIME7 ,
6469 self ::FORMAT_DATE_TIME8 ,
6570 self ::FORMAT_DATE_YYYYMMDDSLASH ,
71+ self ::FORMAT_DATE_LONG_DATE ,
6672 ];
6773 const TIME_OR_DATETIME_ARRAY = [
6874 self ::FORMAT_DATE_XLSX22 ,
@@ -84,6 +90,21 @@ class NumberFormat extends Supervisor
8490 const FORMAT_ACCOUNTING_USD = '_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_) ' ;
8591 const FORMAT_ACCOUNTING_EUR = '_("€"* #,##0.00_);_("€"* \(#,##0.00\);_("€"* "-"??_);_(@_) ' ;
8692
93+ const SHORT_DATE_INDEX = 14 ;
94+ const DATE_TIME_INDEX = 22 ;
95+ const FORMAT_SYSDATE_X = '[$-x-sysdate] ' ;
96+ const FORMAT_SYSDATE_F800 = '[$-F800] ' ;
97+ const FORMAT_SYSTIME_X = '[$-x-systime] ' ;
98+ const FORMAT_SYSTIME_F400 = '[$-F400] ' ;
99+
100+ protected static string $ shortDateFormat = self ::FORMAT_DATE_XLSX14_ACTUAL ;
101+
102+ protected static string $ longDateFormat = self ::FORMAT_DATE_LONG_DATE ;
103+
104+ protected static string $ dateTimeFormat = self ::FORMAT_DATE_XLSX22_ACTUAL ;
105+
106+ protected static string $ timeFormat = self ::FORMAT_DATE_TIME2 ;
107+
87108 /**
88109 * Excel built-in number formats.
89110 */
@@ -178,16 +199,40 @@ public function applyFromArray(array $styleArray): static
178199 /**
179200 * Get Format Code.
180201 */
181- public function getFormatCode (): ?string
202+ public function getFormatCode (bool $ extended = false ): ?string
182203 {
183204 if ($ this ->isSupervisor ) {
184- return $ this ->getSharedComponent ()->getFormatCode ();
205+ return $ this ->getSharedComponent ()->getFormatCode ($ extended );
185206 }
186- if (is_int ($ this ->builtInFormatCode )) {
187- return self ::builtInFormatCode ($ this ->builtInFormatCode );
207+ $ builtin = $ this ->getBuiltInFormatCode ();
208+ if (is_int ($ builtin )) {
209+ if ($ extended ) {
210+ if ($ builtin === self ::SHORT_DATE_INDEX ) {
211+ return self ::$ shortDateFormat ;
212+ }
213+ if ($ builtin === self ::DATE_TIME_INDEX ) {
214+ return self ::$ dateTimeFormat ;
215+ }
216+ }
217+
218+ return self ::builtInFormatCode ($ builtin );
188219 }
189220
190- return $ this ->formatCode ;
221+ return $ extended ? self ::convertSystemFormats ($ this ->formatCode ) : $ this ->formatCode ;
222+ }
223+
224+ public static function convertSystemFormats (?string $ formatCode ): ?string
225+ {
226+ if (is_string ($ formatCode )) {
227+ if (stripos ($ formatCode , self ::FORMAT_SYSDATE_F800 ) !== false || stripos ($ formatCode , self ::FORMAT_SYSDATE_X ) !== false ) {
228+ return self ::$ longDateFormat ;
229+ }
230+ if (stripos ($ formatCode , self ::FORMAT_SYSTIME_F400 ) !== false || stripos ($ formatCode , self ::FORMAT_SYSTIME_X ) !== false ) {
231+ return self ::$ timeFormat ;
232+ }
233+ }
234+
235+ return $ formatCode ;
191236 }
192237
193238 /**
@@ -290,15 +335,15 @@ private static function fillBuiltInFormatCodes(): void
290335 self ::$ builtInFormats [11 ] = '0.00E+00 ' ;
291336 self ::$ builtInFormats [12 ] = '# ?/? ' ;
292337 self ::$ builtInFormats [13 ] = '# ??/?? ' ;
293- self ::$ builtInFormats [14 ] = ' m/d/yyyy ' ; // Despite ECMA 'mm-dd-yy';
294- self ::$ builtInFormats [15 ] = ' d-mmm-yy ' ;
338+ self ::$ builtInFormats [14 ] = self :: FORMAT_DATE_XLSX14_ACTUAL ; // Despite ECMA 'mm-dd-yy';
339+ self ::$ builtInFormats [15 ] = self :: FORMAT_DATE_XLSX15 ;
295340 self ::$ builtInFormats [16 ] = 'd-mmm ' ;
296341 self ::$ builtInFormats [17 ] = 'mmm-yy ' ;
297342 self ::$ builtInFormats [18 ] = 'h:mm AM/PM ' ;
298343 self ::$ builtInFormats [19 ] = 'h:mm:ss AM/PM ' ;
299344 self ::$ builtInFormats [20 ] = 'h:mm ' ;
300345 self ::$ builtInFormats [21 ] = 'h:mm:ss ' ;
301- self ::$ builtInFormats [22 ] = ' m/d/yyyy h:mm ' ; // Despite ECMA 'm/d/yy h:mm';
346+ self ::$ builtInFormats [22 ] = self :: FORMAT_DATE_XLSX22_ACTUAL ; // Despite ECMA 'm/d/yy h:mm';
302347
303348 self ::$ builtInFormats [37 ] = '#,##0_);(#,##0) ' ; // Despite ECMA '#,##0 ;(#,##0)';
304349 self ::$ builtInFormats [38 ] = '#,##0_);[Red](#,##0) ' ; // Despite ECMA '#,##0 ;[Red](#,##0)';
@@ -427,4 +472,44 @@ protected function exportArray1(): array
427472
428473 return $ exportedArray ;
429474 }
475+
476+ public static function getShortDateFormat (): string
477+ {
478+ return self ::$ shortDateFormat ;
479+ }
480+
481+ public static function setShortDateFormat (string $ shortDateFormat ): void
482+ {
483+ self ::$ shortDateFormat = $ shortDateFormat ;
484+ }
485+
486+ public static function getLongDateFormat (): string
487+ {
488+ return self ::$ longDateFormat ;
489+ }
490+
491+ public static function setLongDateFormat (string $ longDateFormat ): void
492+ {
493+ self ::$ longDateFormat = $ longDateFormat ;
494+ }
495+
496+ public static function getDateTimeFormat (): string
497+ {
498+ return self ::$ dateTimeFormat ;
499+ }
500+
501+ public static function setDateTimeFormat (string $ dateTimeFormat ): void
502+ {
503+ self ::$ dateTimeFormat = $ dateTimeFormat ;
504+ }
505+
506+ public static function getTimeFormat (): string
507+ {
508+ return self ::$ timeFormat ;
509+ }
510+
511+ public static function setTimeFormat (string $ timeFormat ): void
512+ {
513+ self ::$ timeFormat = $ timeFormat ;
514+ }
430515}
0 commit comments