@@ -170,6 +170,15 @@ or [`nothing`](@ref) if no message is provided. For use by `validargs`.
170
170
argerror (msg:: String ) = ArgumentError (msg)
171
171
argerror () = nothing
172
172
173
+ # Julia uses 24-hour clocks internally, but user input can be AM/PM with 12pm == noon and 12am == midnight.
174
+ @enum AMPM AM PM TWENTYFOURHOUR
175
+ function adjusthour (h:: Int64 , ampm:: AMPM )
176
+ ampm == TWENTYFOURHOUR && return h
177
+ ampm == PM && h < 12 && return h + 12
178
+ ampm == AM && h == 12 && return Int64 (0 )
179
+ return h
180
+ end
181
+
173
182
# ## CONSTRUCTORS ###
174
183
# Core constructors
175
184
"""
@@ -178,19 +187,24 @@ argerror() = nothing
178
187
Construct a `DateTime` type by parts. Arguments must be convertible to [`Int64`](@ref).
179
188
"""
180
189
function DateTime (y:: Int64 , m:: Int64 = 1 , d:: Int64 = 1 ,
181
- h:: Int64 = 0 , mi:: Int64 = 0 , s:: Int64 = 0 , ms:: Int64 = 0 )
182
- err = validargs (DateTime, y, m, d, h, mi, s, ms)
190
+ h:: Int64 = 0 , mi:: Int64 = 0 , s:: Int64 = 0 , ms:: Int64 = 0 , ampm :: AMPM = TWENTYFOURHOUR )
191
+ err = validargs (DateTime, y, m, d, h, mi, s, ms, ampm )
183
192
err === nothing || throw (err)
193
+ h = adjusthour (h, ampm)
184
194
rata = ms + 1000 * (s + 60 mi + 3600 h + 86400 * totaldays (y, m, d))
185
195
return DateTime (UTM (rata))
186
196
end
187
197
188
198
function validargs (:: Type{DateTime} , y:: Int64 , m:: Int64 , d:: Int64 ,
189
- h:: Int64 , mi:: Int64 , s:: Int64 , ms:: Int64 )
199
+ h:: Int64 , mi:: Int64 , s:: Int64 , ms:: Int64 , ampm :: AMPM = TWENTYFOURHOUR )
190
200
0 < m < 13 || return argerror (" Month: $m out of range (1:12)" )
191
201
0 < d < daysinmonth (y, m) + 1 || return argerror (" Day: $d out of range (1:$(daysinmonth (y, m)) )" )
192
- - 1 < h < 24 || (h == 24 && mi== s== ms== 0 ) ||
193
- return argerror (" Hour: $h out of range (0:23)" )
202
+ if ampm == TWENTYFOURHOUR # 24-hour clock
203
+ - 1 < h < 24 || (h == 24 && mi== s== ms== 0 ) ||
204
+ return argerror (" Hour: $h out of range (0:23)" )
205
+ else
206
+ 0 < h < 13 || return argerror (" Hour: $h out of range (1:12)" )
207
+ end
194
208
- 1 < mi < 60 || return argerror (" Minute: $mi out of range (0:59)" )
195
209
- 1 < s < 60 || return argerror (" Second: $s out of range (0:59)" )
196
210
- 1 < ms < 1000 || return argerror (" Millisecond: $ms out of range (0:999)" )
@@ -223,14 +237,19 @@ Date(dt::Base.Libc.TmStruct) = Date(1900 + dt.year, 1 + dt.month, dt.mday)
223
237
224
238
Construct a `Time` type by parts. Arguments must be convertible to [`Int64`](@ref).
225
239
"""
226
- function Time (h:: Int64 , mi:: Int64 = 0 , s:: Int64 = 0 , ms:: Int64 = 0 , us:: Int64 = 0 , ns:: Int64 = 0 )
227
- err = validargs (Time, h, mi, s, ms, us, ns)
240
+ function Time (h:: Int64 , mi:: Int64 = 0 , s:: Int64 = 0 , ms:: Int64 = 0 , us:: Int64 = 0 , ns:: Int64 = 0 , ampm :: AMPM = TWENTYFOURHOUR )
241
+ err = validargs (Time, h, mi, s, ms, us, ns, ampm )
228
242
err === nothing || throw (err)
243
+ h = adjusthour (h, ampm)
229
244
return Time (Nanosecond (ns + 1000 us + 1000000 ms + 1000000000 s + 60000000000 mi + 3600000000000 h))
230
245
end
231
246
232
- function validargs (:: Type{Time} , h:: Int64 , mi:: Int64 , s:: Int64 , ms:: Int64 , us:: Int64 , ns:: Int64 )
233
- - 1 < h < 24 || return argerror (" Hour: $h out of range (0:23)" )
247
+ function validargs (:: Type{Time} , h:: Int64 , mi:: Int64 , s:: Int64 , ms:: Int64 , us:: Int64 , ns:: Int64 , ampm:: AMPM = TWENTYFOURHOUR)
248
+ if ampm == TWENTYFOURHOUR # 24-hour clock
249
+ - 1 < h < 24 || return argerror (" Hour: $h out of range (0:23)" )
250
+ else
251
+ 0 < h < 13 || return argerror (" Hour: $h out of range (1:12)" )
252
+ end
234
253
- 1 < mi < 60 || return argerror (" Minute: $mi out of range (0:59)" )
235
254
- 1 < s < 60 || return argerror (" Second: $s out of range (0:59)" )
236
255
- 1 < ms < 1000 || return argerror (" Millisecond: $ms out of range (0:999)" )
@@ -345,9 +364,9 @@ function DateTime(dt::Date, t::Time)
345
364
end
346
365
347
366
# Fallback constructors
348
- DateTime (y, m= 1 , d= 1 , h= 0 , mi= 0 , s= 0 , ms= 0 ) = DateTime (Int64 (y), Int64 (m), Int64 (d), Int64 (h), Int64 (mi), Int64 (s), Int64 (ms))
367
+ DateTime (y, m= 1 , d= 1 , h= 0 , mi= 0 , s= 0 , ms= 0 , ampm :: AMPM = TWENTYFOURHOUR ) = DateTime (Int64 (y), Int64 (m), Int64 (d), Int64 (h), Int64 (mi), Int64 (s), Int64 (ms), ampm )
349
368
Date (y, m= 1 , d= 1 ) = Date (Int64 (y), Int64 (m), Int64 (d))
350
- Time (h, mi= 0 , s= 0 , ms= 0 , us= 0 , ns= 0 ) = Time (Int64 (h), Int64 (mi), Int64 (s), Int64 (ms), Int64 (us), Int64 (ns))
369
+ Time (h, mi= 0 , s= 0 , ms= 0 , us= 0 , ns= 0 , ampm :: AMPM = TWENTYFOURHOUR ) = Time (Int64 (h), Int64 (mi), Int64 (s), Int64 (ms), Int64 (us), Int64 (ns), ampm )
351
370
352
371
# Traits, Equality
353
372
Base. isfinite (:: Union{Type{T}, T} ) where {T<: TimeType } = true
0 commit comments