具有ISO8601日期时间字符串,例如2020-11-22T12:14:50+0100
和2020-11-22T12:14:50+0200
(注意不同的时区),是否可以使用Julia'sDates.DateTime(::DateTime, ::DateFormat)
通过在DateFormat
?中添加一些通配符将其转换为正确的日期时间?我们从文档中学习:
与Java 8中的LocalDateTime相似,DateTime类型不知道时区(以Python的说法是天真),可以通过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
如果您真的只想浪费所有TimeZone信息,我可能会通过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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句