www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 24704] New: DateTime.fromISOExtString Does Not Support

https://issues.dlang.org/show_bug.cgi?id=24704

          Issue ID: 24704
           Summary: DateTime.fromISOExtString Does Not Support ISO8601
                    Time Unit Fractions
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P1
         Component: phobos
          Assignee: nobody puremagic.com
          Reporter: madric gmail.com



When parsing ISO8601 date-times using DateTime.fromISOExtString, the fraction
component of the last time unit causes an exception to be thrown.



The method
https://dlang.org/phobos/std_datetime_date.html#.DateTime.fromISOExtString is
built to support the ISO8601 standard:
https://en.wikipedia.org/wiki/ISO_8601#Times

According to this standard:

 A decimal fraction may be added to the lowest order time element present in
any of these representations. A decimal mark, either a comma or a dot on the
baseline, is used as a separator between the time element and its fraction.
(Following ISO 80000-1 according to ISO 8601:1-2019,[27] it does not stipulate
a preference except within International Standards, but with a preference for a
comma according to ISO 8601:2004.[28]) For example, to denote "14 hours, 30 and
one half minutes", do not include a seconds figure; represent it as "14:30,5",
"T1430,5", "14:30.5", or "T1430.5".

 There is no limit on the number of decimal places for the decimal fraction.
However, the number of decimal places needs to be agreed to by the
communicating parties. For example, in Microsoft SQL Server, the precision of a
decimal fraction is 3 for a DATETIME, i.e., "yyyy-mm-ddThh:mm:ss[.mmm]".[29]
Create the following program: ``` void main() { import std.datetime; auto b = DateTime.fromISOExtString("2024-08-15T08:13:23.000"); } ``` The date-time should be parsed, with the fraction being interpreted as a fraction of the seconds unit. An exception is thrown of the form: ``` core.time.TimeException /dlang/dmd/linux/bin64/../../src/phobos/std/datetime/date.d(9334): Invalid ISO Extended String: 08:13:23.000 ---------------- /dlang/dmd/linux/bin64/../../src/phobos/std/datetime/date.d:9334 pure safe std.datetime.date.TimeOfDay std.datetime.date.TimeOfDay.fromISOExtString!(immutable(char)[]).fromISOExtString(scope const(immutable(char)[])) [0x5626aa88fea9] /dlang/dmd/linux/bin64/../../src/phobos/std/datetime/date.d:3271 pure safe std.datetime.date.DateTime std.datetime.date.DateTime.fromISOExtString!(immutable(char)[]).fromISOExtString(scope const(immutable(char)[])) [0x5626aa87f85e] ./onlineapp.d:7 _Dmain [0x5626aa87ebc7] ``` --
Aug 15