time: fix `time.parse_iso8601(2037-07-23)?.add_days(181).str() == "1901-12-13 17:31:44"`
parent
9f8c3cc159
commit
55eeb701a9
|
@ -0,0 +1,13 @@
|
|||
import time
|
||||
|
||||
fn test_time_after_2038_works() {
|
||||
after_time := time.parse_iso8601('2037-07-23') or { time.now() }
|
||||
dump(after_time)
|
||||
error_time := after_time.add_days(180)
|
||||
dump(error_time)
|
||||
assert error_time.str() == '2038-01-19 00:00:00'
|
||||
// NB: the next date is after Y2K38, it should NOT wrap:
|
||||
error_time2 := after_time.add_days(181)
|
||||
dump(error_time2)
|
||||
assert error_time2.str() == '2038-01-20 00:00:00'
|
||||
}
|
|
@ -381,7 +381,7 @@ fn test_subtract() {
|
|||
second: 3
|
||||
microsecond: 100
|
||||
})
|
||||
t2 := unix2(int(t1.unix) + d_seconds, t1.microsecond + d_microseconds)
|
||||
t2 := unix2(i64(t1.unix) + d_seconds, t1.microsecond + d_microseconds)
|
||||
d1 := t2 - t1
|
||||
d2 := t1 - t2
|
||||
assert d1 > 0
|
||||
|
|
|
@ -135,6 +135,6 @@ pub fn parse_iso8601(s string) ?Time {
|
|||
} else if unix_offset > 0 {
|
||||
unix_time += u64(unix_offset)
|
||||
}
|
||||
t = unix2(int(unix_time), t.microsecond)
|
||||
t = unix2(i64(unix_time), t.microsecond)
|
||||
return t
|
||||
}
|
||||
|
|
|
@ -137,7 +137,7 @@ pub fn utc() Time {
|
|||
// in this API call
|
||||
t := C.time(0)
|
||||
_ = C.time(&t)
|
||||
return unix2(int(t), 0)
|
||||
return unix2(i64(t), 0)
|
||||
}
|
||||
|
||||
// smonth returns month name.
|
||||
|
@ -186,7 +186,7 @@ pub fn (t Time) add(d Duration) Time {
|
|||
microseconds := i64(t.unix) * 1000 * 1000 + t.microsecond + d.microseconds()
|
||||
unix := microseconds / (1000 * 1000)
|
||||
micro := microseconds % (1000 * 1000)
|
||||
return unix2(int(unix), int(micro))
|
||||
return unix2(unix, int(micro))
|
||||
}
|
||||
|
||||
// add_seconds returns a new time struct with an added number of seconds.
|
||||
|
|
|
@ -80,5 +80,5 @@ fn darwin_utc() Time {
|
|||
// get the high precision time as UTC clock
|
||||
tv := C.timeval{}
|
||||
C.gettimeofday(&tv, 0)
|
||||
return unix2(int(tv.tv_sec), int(tv.tv_usec))
|
||||
return unix2(i64(tv.tv_sec), int(tv.tv_usec))
|
||||
}
|
||||
|
|
|
@ -86,7 +86,7 @@ fn linux_utc() Time {
|
|||
// and use the nanoseconds part
|
||||
mut ts := C.timespec{}
|
||||
C.clock_gettime(C.CLOCK_REALTIME, &ts)
|
||||
return unix2(int(ts.tv_sec), int(ts.tv_nsec / 1000))
|
||||
return unix2(i64(ts.tv_sec), int(ts.tv_nsec / 1000))
|
||||
}
|
||||
|
||||
// dummy to compile with all compilers
|
||||
|
|
|
@ -18,7 +18,7 @@ fn solaris_utc() Time {
|
|||
// and use the nanoseconds part
|
||||
mut ts := C.timespec{}
|
||||
C.clock_gettime(C.CLOCK_REALTIME, &ts)
|
||||
return unix2(int(ts.tv_sec), int(ts.tv_nsec / 1000))
|
||||
return unix2(i64(ts.tv_sec), int(ts.tv_nsec / 1000))
|
||||
}
|
||||
|
||||
// dummy to compile with all compilers
|
||||
|
|
|
@ -25,7 +25,7 @@ pub fn unix(abs int) Time {
|
|||
}
|
||||
|
||||
// unix2 returns a time struct from Unix time and microsecond value
|
||||
pub fn unix2(abs int, microsecond int) Time {
|
||||
pub fn unix2(abs i64, microsecond int) Time {
|
||||
// Split into day and time
|
||||
mut day_offset := abs / seconds_per_day
|
||||
if abs % seconds_per_day < 0 {
|
||||
|
@ -46,7 +46,7 @@ pub fn unix2(abs int, microsecond int) Time {
|
|||
}
|
||||
}
|
||||
|
||||
fn calculate_date_from_offset(day_offset_ int) (int, int, int) {
|
||||
fn calculate_date_from_offset(day_offset_ i64) (int, int, int) {
|
||||
mut day_offset := day_offset_
|
||||
// Move offset to year 2001 as it's the start of a new 400-year cycle
|
||||
// Code below this rely on the fact that the day_offset is lined up with the 400-year cycle
|
||||
|
@ -54,14 +54,14 @@ fn calculate_date_from_offset(day_offset_ int) (int, int, int) {
|
|||
mut year := 2001
|
||||
day_offset -= 31 * 365 + 8
|
||||
// Account for 400 year cycle
|
||||
year += (day_offset / days_per_400_years) * 400
|
||||
year += int(day_offset / days_per_400_years) * 400
|
||||
day_offset %= days_per_400_years
|
||||
// Account for 100 year cycle
|
||||
if day_offset == days_per_100_years * 4 {
|
||||
year += 300
|
||||
day_offset -= days_per_100_years * 3
|
||||
} else {
|
||||
year += (day_offset / days_per_100_years) * 100
|
||||
year += int(day_offset / days_per_100_years) * 100
|
||||
day_offset %= days_per_100_years
|
||||
}
|
||||
// Account for 4 year cycle
|
||||
|
@ -69,7 +69,7 @@ fn calculate_date_from_offset(day_offset_ int) (int, int, int) {
|
|||
year += 96
|
||||
day_offset -= days_per_4_years * 24
|
||||
} else {
|
||||
year += (day_offset / days_per_4_years) * 4
|
||||
year += int(day_offset / days_per_4_years) * 4
|
||||
day_offset %= days_per_4_years
|
||||
}
|
||||
// Account for every year
|
||||
|
@ -77,7 +77,7 @@ fn calculate_date_from_offset(day_offset_ int) (int, int, int) {
|
|||
year += 3
|
||||
day_offset -= 365 * 3
|
||||
} else {
|
||||
year += (day_offset / 365)
|
||||
year += int(day_offset / 365)
|
||||
day_offset %= 365
|
||||
}
|
||||
if day_offset < 0 {
|
||||
|
@ -108,10 +108,10 @@ fn calculate_date_from_offset(day_offset_ int) (int, int, int) {
|
|||
estimated_month--
|
||||
}
|
||||
day_offset -= days_before[estimated_month]
|
||||
return year, estimated_month + 1, day_offset + 1
|
||||
return year, int(estimated_month + 1), int(day_offset + 1)
|
||||
}
|
||||
|
||||
fn calculate_time_from_offset(second_offset_ int) (int, int, int) {
|
||||
fn calculate_time_from_offset(second_offset_ i64) (int, int, int) {
|
||||
mut second_offset := second_offset_
|
||||
if second_offset < 0 {
|
||||
second_offset += seconds_per_day
|
||||
|
@ -120,5 +120,5 @@ fn calculate_time_from_offset(second_offset_ int) (int, int, int) {
|
|||
second_offset %= seconds_per_hour
|
||||
min := second_offset / seconds_per_minute
|
||||
second_offset %= seconds_per_minute
|
||||
return hour_, min, second_offset
|
||||
return int(hour_), int(min), int(second_offset)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue