Files
PhpSpreadsheet/tests/data/Style/NumberFormatDates.php
T
oleibman 7fe5ee84ea Time Interval Formatting
Fix #2768. DateFormatter handles only one of six special formats for time intervals `[h] [hh] [m] [mm] [s] [ss]`. This PR extends support to the rest. There should be no more than one of these in any format string. Although it certainly could make sense to treat `[d] [dd]` in the same manner, Excel does not seem to support those.

Interesting observations - hours and minutes are truncated (presumably because they may be followed by minutes and seconds), but seconds are rounded. Also, there are some floating point issues, which fortunately showed up for the example in the original issue. There, the time interval was 1.15, which should evaluate to a minutes value of 1656 (as it does in Excel). However, on my system it evaluated to 1655 because of a rounding error in the 13th decimal place. To overcome this, values are rounded to 10 decimal places before truncating.
2022-04-23 11:12:46 -07:00

166 lines
3.3 KiB
PHP

<?php
return [
[
'19-12-1960 01:30:00',
22269.0625,
'dd-mm-yyyy hh:mm:ss',
],
// Oasis uses upper-case
[
'12/19/1960 01:30:00',
22269.0625,
'MM/DD/YYYY HH:MM:SS',
],
// Date with plaintext escaped with a \
[
'1960-12-19T01:30:00',
22269.0625,
'yyyy-mm-dd\\Thh:mm:ss',
],
// Date with plaintext in quotes
[
'1960-12-19T01:30:00 Z',
22269.0625,
'yyyy-mm-dd"T"hh:mm:ss \\Z',
],
// Date with quoted formatting characters
[
'y-m-d 1960-12-19 h:m:s 01:30:00',
22269.0625,
'"y-m-d" yyyy-mm-dd "h:m:s" hh:mm:ss',
],
// Date with quoted formatting characters
[
'y-m-d 1960-12-19 h:m:s 01:30:00',
22269.0625,
'"y-m-d "yyyy-mm-dd" h:m:s "hh:mm:ss',
],
[
'07:35:00 AM',
43270.315972222,
'hh:mm:ss\ AM/PM',
],
[
'02:29:00 PM',
43270.603472222,
'hh:mm:ss\ AM/PM',
],
[
'8/20/2018',
43332,
'[$-409]m/d/yyyy',
],
[
'8/20/2018',
43332,
'[$-1010409]m/d/yyyy',
],
[
'27:15',
1.1354166666667,
'[h]:mm',
],
[
'19331018',
12345.6789,
'[DBNum4][$-804]yyyymmdd;@',
],
// Technically should be 19331018
[
'19331018',
12345.6789,
'[DBNum3][$-zh-CN]yyyymmdd;@',
],
'hour with leading 0 and minute' => [
'03:36',
1.15,
'hh:mm',
],
'hour without leading 0 and minute' => [
'3:36',
1.15,
'h:mm',
],
'hour truncated not rounded' => [
'27',
1.15,
'[hh]',
],
'interval hour > 10 so no need for leading 0 and minute' => [
'27:36',
1.15,
'[hh]:mm',
],
'interval hour > 10 no leading 0 and minute' => [
'27:36',
1.15,
'[h]:mm',
],
'interval hour with leading 0 and minute' => [
'03:36',
0.15,
'[hh]:mm',
],
'interval hour no leading 0 and minute' => [
'3:36',
0.15,
'[h]:mm',
],
'interval hours > 100 and minutes no need for leading 0' => [
'123:36',
5.15,
'[hh]:mm',
],
'interval hours > 100 and minutes no leading 0' => [
'123:36',
5.15,
'[h]:mm',
],
'interval minutes > 10 no need for leading 0' => [
'1656',
1.15,
'[mm]',
],
'interval minutes > 10 no leading 0' => [
'1656',
1.15,
'[m]',
],
'interval minutes < 10 leading 0' => [
'07',
0.005,
'[mm]',
],
'interval minutes < 10 no leading 0' => [
'7',
0.005,
'[m]',
],
'interval minutes and seconds' => [
'07:12',
0.005,
'[mm]:ss',
],
'interval seconds' => [
'432',
0.005,
'[ss]',
],
'interval seconds rounded up leading 0' => [
'09',
0.0001,
'[ss]',
],
'interval seconds rounded up no leading 0' => [
'9',
0.0001,
'[s]',
],
'interval seconds rounded down' => [
'6',
0.00007,
'[s]',
],
];