Francis Smart
Francis Smart

Reputation: 4065

In Julia, how do I set DateFormat year for 19 meaning 2019?

I have dates that look like "17-JAN-19", "18-FEB-20". When I attempt to use the Dates package Date("17-JAN-19", "d-u-yy") I get reasonably 0019-01-17. I could do Date("17-JAN-19", "d-u-yy") + Year(2000) but that introduces the possibility of new errors (I was going to give the example of leap year but that generally works though there is the very rare error Date("29-FEB-00", "d-u-yy")+Year(1900)).

Is there a date format that embeds known information about century?

Upvotes: 2

Views: 130

Answers (1)

As mentioned in https://github.com/JuliaLang/julia/issues/30002 there are multiple heuristics for assigning the century to a date. I would recommend being explicit and handling it through a helper function.

const NOCENTURYDF = DateFormat("d-u-y")
"""
    parse_date(obj::AbstractString,
               breakpoint::Integer = year(now()) - 2000,
               century::Integer = 20)

Parses date in according to DateFormat("d-u-y") after attaching century information.
If the year portion is greater that the current year,
it assumes it corresponds to the previous century.
"""
function parse_date(obj::AbstractString,
                    breakpoint::Integer = year(now()) - 2000,
                    century::Integer = 20)
    # breakpoint = year(now()) - 2000
    # century = year(now()) ÷ 100
    @assert 0 ≤ breakpoint ≤ 99
    yy = rpad(parse(Int, match(r"\d{2}$", obj).match), 2, '0')
    Date(string(obj[1:7],
                century - (parse(Int, yy) > breakpoint),
                yy),
         NOCENTURYDF)
end
parse_date("17-JAN-19")
parse_date("29-FEB-00")

Upvotes: 2

Related Questions