在Julia中,我有一个2018.003828474404
之类的浮点数。浮点数应解释为代表DateTime(2018,1,2,9,53,1)
。浮点数的.003828474404
分量代表自2018年初以来经过的那一年的比例。
Float64
转换为DateTime
。Float64
转换为Date
。这样会失去精度,并有InexactError()
的风险,但就我的目的而言,最近的一天就可以了。答案 0 :(得分:2)
尽管相对于一年来说,这似乎是一个固定的数量,但是0.003828...
之后的2018
值代表的是特定年份 在2018年至2019年之间的一小部分,因为所有年的长度略有不同(例如,leap年)。 Dates
认真对待这一事实。
我们可以定义以下函数partial_year
以指定的精度计算结果(默认为Nanosecond
,由Dates
提供最精确的结果)。
using Dates
function partial_year(period::Type{<:Period}, float::AbstractFloat)
_year, Δ = divrem(float, 1)
year_start = DateTime(_year)
year = period((year_start + Year(1)) - year_start)
partial = period(round(Dates.value(year) * Δ))
year_start + partial
end
partial_year(float::AbstractFloat) = partial_year(Nanosecond, float)
首先,我们将起始年份与该年份的剩余部分分开。我们使用时间段的Dates
处理来计算指定年份的确切长度,并将其转换为类型period
以达到我们期望的精度。我们将这个year
值乘以一年的分数,将结果取整(因为不允许小数Period
,然后将其转换回period
。最后,我们将partial
年添加到year_start
中。
如预期的那样,我们可以在您的示例中以各种精度使用它:
julia> partial_year(2018.003828474404)
2018-01-02T09:32:14.768
julia> partial_year(Minute, 2018.003828474404)
2018-01-02T09:32:00