【问题标题】:Convert ISO8601 date with timezone to DateTime in Julia将带时区的 ISO8601 日期转换为 Julia 中的 DateTime
【发布时间】:2020-12-15 15:59:21
【问题描述】:

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

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

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"))

【问题讨论】:

    标签: string datetime julia


    【解决方案1】:

    正如您引用的文档所建议的那样,此功能由 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 信息,我可能会在最后一个 +- 字符上通过 splitting 来完成,而不是使用正则表达式(有一些 half- and even quarter-hour timezones,所以您的正则表达式并不总是有效)。

    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
    

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 2015-10-27
      • 1970-01-01
      • 2012-07-07
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      相关资源
      最近更新 更多