-
-
Notifications
You must be signed in to change notification settings - Fork 5.5k
/
conversions.jl
130 lines (100 loc) · 3.79 KB
/
conversions.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
# This file is a part of Julia. License is MIT: https://julialang.org/license
# Conversion/Promotion
"""
Date(dt::DateTime) -> Date
Convert a `DateTime` to a `Date`. The hour, minute, second, and millisecond parts of
the `DateTime` are truncated, so only the year, month and day parts are used in
construction.
"""
Date(dt::TimeType) = convert(Date, dt)
"""
DateTime(dt::Date) -> DateTime
Convert a `Date` to a `DateTime`. The hour, minute, second, and millisecond parts of
the new `DateTime` are assumed to be zero.
"""
DateTime(dt::TimeType) = convert(DateTime, dt)
"""
Time(dt::DateTime) -> Time
Convert a `DateTime` to a `Time`. The hour, minute, second, and millisecond parts of
the `DateTime` are used to create the new `Time`. Microsecond and nanoseconds are zero by default.
"""
Time(dt::DateTime) = convert(Time, dt)
Base.convert(::Type{DateTime}, dt::Date) = DateTime(UTM(value(dt) * 86400000))
Base.convert(::Type{Date}, dt::DateTime) = Date(UTD(days(dt)))
Base.convert(::Type{Time}, dt::DateTime) = Time(Nanosecond((value(dt) % 86400000) * 1000000))
Base.convert(::Type{DateTime},x::Millisecond) = DateTime(Dates.UTInstant(x)) # Converts Rata Die milliseconds to a DateTime
Base.convert(::Type{Millisecond},dt::DateTime) = Millisecond(value(dt)) # Converts DateTime to Rata Die milliseconds
Base.convert(::Type{Date},x::Day) = Date(Dates.UTInstant(x)) # Converts Rata Die days to a Date
Base.convert(::Type{Day},dt::Date) = Day(value(dt)) # Converts Date to Rata Die days
### External Conversions
const UNIXEPOCH = value(DateTime(1970)) #Rata Die milliseconds for 1970-01-01T00:00:00
"""
unix2datetime(x) -> DateTime
Take the number of seconds since unix epoch `1970-01-01T00:00:00` and convert to the
corresponding `DateTime`.
"""
function unix2datetime(x)
# Rounding should match `now` below
rata = UNIXEPOCH + trunc(Int64, Int64(1000) * x)
return DateTime(UTM(rata))
end
"""
datetime2unix(dt::DateTime) -> Float64
Take the given `DateTime` and return the number of seconds
since the unix epoch `1970-01-01T00:00:00` as a [`Float64`](@ref).
"""
datetime2unix(dt::DateTime) = (value(dt) - UNIXEPOCH) / 1000.0
"""
now() -> DateTime
Return a `DateTime` corresponding to the user's system time including the system timezone
locale.
"""
function now()
tv = Libc.TimeVal()
tm = Libc.TmStruct(tv.sec)
return DateTime(tm.year + 1900, tm.month + 1, tm.mday, tm.hour, tm.min, tm.sec, div(tv.usec, 1000))
end
"""
today() -> Date
Return the date portion of `now()`.
"""
today() = Date(now())
"""
now(::Type{UTC}) -> DateTime
Return a `DateTime` corresponding to the user's system time as UTC/GMT.
For other time zones, see the TimeZones.jl package.
# Examples
```julia
julia> now(UTC)
2023-01-04T10:52:24.864
```
"""
now(::Type{UTC}) = unix2datetime(time())
"""
rata2datetime(days) -> DateTime
Take the number of Rata Die days since epoch `0000-12-31T00:00:00` and return the
corresponding `DateTime`.
"""
rata2datetime(days) = DateTime(yearmonthday(days)...)
"""
datetime2rata(dt::TimeType) -> Int64
Return the number of Rata Die days since epoch from the given `Date` or `DateTime`.
"""
datetime2rata(dt::TimeType) = days(dt)
# Julian conversions
const JULIANEPOCH = value(DateTime(-4713, 11, 24, 12))
"""
julian2datetime(julian_days) -> DateTime
Take the number of Julian calendar days since epoch `-4713-11-24T12:00:00` and return the
corresponding `DateTime`.
"""
function julian2datetime(f)
rata = JULIANEPOCH + round(Int64, Int64(86400000) * f)
return DateTime(UTM(rata))
end
"""
datetime2julian(dt::DateTime) -> Float64
Take the given `DateTime` and return the number of Julian calendar days since the julian
epoch `-4713-11-24T12:00:00` as a [`Float64`](@ref).
"""
datetime2julian(dt::DateTime) = (value(dt) - JULIANEPOCH) / 86400000.0