Julia从Dates包中将秒转换为整数:没有与Int64(:: Second)匹配的方法

时间:2019-05-21 05:12:38

标签: datetime julia

我正在使用Dates模块,并且试图将Seconds对象转换为整数。

当我尝试以下操作时,出现错误:

x = Second(5)
Int(x)
# ERROR: MethodError: no method matching Int64(::Second)

为什么这行不通?如何将其提取为整数值?

我的问题还适用于将分钟转换为整数,将天转换为整数,将月转换为整数等。

2 个答案:

答案 0 :(得分:3)

为扩展J. Blauvelt的回答,有意省略*。原因是str.split通常意味着等价,并且在向容器中添加元素时会自动使用

convert(Int, d)

如果您允许这种自动转换,您可能会感到很困惑:例如,convert还将julia> c = [1,2] 2-element Array{Int64,1}: 1 2 julia> push!(c, Second(5)) ERROR: MethodError: Cannot `convert` an object of type Second to an object of type Int64 Closest candidates are: convert(::Type{T<:Number}, ::T<:Number) where T<:Number at number.jl:6 convert(::Type{T<:Number}, ::Number) where T<:Number at number.jl:7 convert(::Type{T<:Integer}, ::Ptr) where T<:Integer at pointer.jl:23 ... Stacktrace: [1] push!(::Array{Int64,1}, ::Second) at ./array.jl:853 [2] top-level scope at none:0 放入push!(c, Day(5))中,突然之间您处于您已经暗示5

现在,构造函数语法cDay(5) == Second(5)不同。因此,原则上,也许可以允许这样做。但是从历史上看,两者是交织在一起的,并且可能有很多代码无法区分两者。

因此,当您要求与内部表示形式相关的内容时,现在最好要求用户直接利用该表示形式(例如Int(t))。或者,以一种使您可以将这些值及其单位保持不变的方式编写代码。

答案 1 :(得分:2)

访问第二个对象的.value属性,而不是使用Int构造函数:

x = Second(5)
x.value # 5

这适用于“日期”模块中的其他对象,例如MinuteDayMonth等。

也请查看@tholy的答案,以很好地解释其为何如此结构。

作为旁注,dump()在这种情况下非常有用-当您使用陌生的对象并且您想了解如何访问其属性时,等等:

dump(x)
# Output:
# Second
#  value: Int64 5