it’s quite a hassle to convert a datetime string to a DateTime object when the string contains more digits than DateTime can accommodate.
Is there already a simple solution?
If not . . .
There is an analogous situation when you want an approximate Int value from a string that represents a floating point number:
f = parse(Float64, "3.14")
i = round(Int, f)
So, if there were a “floating-point DateTime” type, we would solve the problem by
f = parse(FloatDateTime, "2023-07-01T12:34:56.123456789")
i = round(DateTime, f)
where the millisecond part of FloatDateTime would be represented internally by a Float64 . . . Likely this would be overkill as you would then have to implement all operations on FloatDateTime . . .
Barring such a drastic solution, I would just split the string at the decimal point, convert the left part to a DateTime, approximate the right part to a 3-digit precision, perhaps with a warning message when the milliseconds is an approximation, and add the latter milliseconds to the former DateTime; or perhaps I would snatch the parser code from the Dates package and modify the milliseconds part to do the approximation; and always use such a personal parser every time I parse a DateTime . . .
This is better in the sense that it takes care of any rounding errors we ignored with the previous solution:
julia> dt, p = match(r"(.*)\.(\d*)", str) # split it to datetime and the fraction of the seconds
RegexMatch("2023-07-01T12:34:56.123456789", 1="2023-07-01T12:34:56", 2="123456789")
julia> ms = 1000parse(Float64, "0."*p)
123.456789
julia> DateTime(dt) + Millisecond(round(Int, ms)) # DateTime's accuracy goes only to milliseconds
2023-07-01T12:34:56.123
Thanks! That’s indeed nice. I guess I’ll put that (plus error handling) into my personal “kitchen sink” module and use it everywhere I need to parse DateTime strings.
Here is a bit of simplification:
(dt, p) = split(str, ".")
According to the ISO standard (see the reference at the bottom of this posting), the decimal point is the only possibility that a DateTime string includes a period character, although your regex is a bit more robust in detecting error when a non-ISO-conforming string is given.