将带时区的ISO8601日期转换为Julia中的DateTime



有像2020-11-22T12:14:50+01002020-11-22T12:14:50+0200这样的ISO8601日期时间字符串(注意时区不同(,是否可以使用Julia的Dates.DateTime(::DateTime, ::DateFormat)通过在DateFormat中添加一些通配符将其转换为正确的日期时间?我们从文档中学习:

DateTime类型不知道时区(用Python的话说,是幼稚的(,类似于Java 8中的LocalDateTime。可以通过TimeZones.jl包添加额外的时区功能,该包编译了IANA时区数据库

x = ["2020-11-22T12:14:50+0100", "2020-11-22T12:14:50+0200"]
Dates.DateTime.(x) # fails

# somewhat hacky but doesn't fail.
x = replace.(x, r"+0.+00" => "") 
Dates.DateTime.(x, DateFormat("y-m-dTH:M:S"))
# 2-element Array{DateTime,1}:
#  2020-11-22T12:14:50
#  2020-11-22T12:14:50

有没有办法添加通配符来避免replace?例如

# not run
Dates.DateTime.(x, DateFormat("y-m-dTH:M:S+0*00"))

正如您引用的文档所建议的,此功能由TimeZones.jl包提供。这是最好的方法:

julia> using Dates, TimeZones
julia> x = ["2020-11-22T12:14:50+0100", "2020-11-22T12:14:50+0200"]
2-element Array{String,1}:
"2020-11-22T12:14:50+0100"
"2020-11-22T12:14:50+0200"
julia> ZonedDateTime.(x, DateFormat("y-m-dTHH:MM:SSzzzz"))
2-element Array{ZonedDateTime,1}:
2020-11-22T12:14:50+01:00
2020-11-22T12:14:50+02:00
julia> DateTime.(x, DateFormat("y-m-dTHH:MM:SSzzzz")) # Drops the timezone
2-element Array{DateTime,1}:
2020-11-22T12:14:50
2020-11-22T12:14:50

如果你真的只是想丢弃所有时区信息,我可能会在最后一个+-字符上使用split,而不是使用正则表达式(有一些半小时甚至四分之一小时的时区,所以正则表达式并不总是有效的(。

julia> first.(rsplit.(x, [['+','-']], limit=2))
2-element Array{SubString{String},1}:
"2020-11-22T12:14:50"
"2020-11-22T12:14:50"
julia> DateTime.(first.(rsplit.(x, [['+','-']], limit=2)), DateFormat("y-m-dTH:M:S"))
2-element Array{DateTime,1}:
2020-11-22T12:14:50
2020-11-22T12:14:50

最新更新