mirror of
https://git.checksum.fail/alec/slon.git
synced 2025-12-08 20:19:56 +02:00
94 lines
2.8 KiB
Plaintext
94 lines
2.8 KiB
Plaintext
|
|
import extern c "time.h" {
|
||
|
|
extern fn time_busy(anon duration: i64)
|
||
|
|
extern fn time_jiffies() -> i64
|
||
|
|
extern fn time_now() -> i64
|
||
|
|
extern fn time_sleep(anon duration: i64)
|
||
|
|
}
|
||
|
|
|
||
|
|
struct Time {
|
||
|
|
fn busy(anon duration: i64) {
|
||
|
|
time_busy(duration)
|
||
|
|
}
|
||
|
|
fn jiffies() throws -> i64 {
|
||
|
|
return time_jiffies()
|
||
|
|
}
|
||
|
|
fn now() throws -> i64 {
|
||
|
|
return time_now()
|
||
|
|
}
|
||
|
|
fn cdate_to_unix(anon cdate: i64) -> i64 {
|
||
|
|
// (cdate - Str2Date("1/1/1970") / CDATE_FREQ + NIST_TIME_OFFSET
|
||
|
|
return (cdate - 3090344933588992) / 49710 + 8575
|
||
|
|
}
|
||
|
|
fn unix_to_cdate(anon unix: i64) -> i64 {
|
||
|
|
// (unix - NIST_TIME_OFFSET) * CDATE_FREQ + Str2Date("1/1/1970")
|
||
|
|
return (unix - 8575) * 49710 + 3090344933588992
|
||
|
|
}
|
||
|
|
fn sleep(anon duration: i64) {
|
||
|
|
time_sleep(duration)
|
||
|
|
}
|
||
|
|
fn timestamp_from_unix(anon timestamp: i64) -> String {
|
||
|
|
|
||
|
|
let SECS_PER_DAY = 86400
|
||
|
|
let DAYS_PER_YEAR = 365
|
||
|
|
let DAYS_PER_LYEAR = 366
|
||
|
|
let DAYS_PER_LYEAR_PERIOD = 146097
|
||
|
|
let YEARS_PER_LYEAR_PERIOD = 400
|
||
|
|
|
||
|
|
mut days = timestamp / SECS_PER_DAY
|
||
|
|
mut remainder = timestamp - (days * SECS_PER_DAY)
|
||
|
|
if timestamp < 0 and remainder == 0 {
|
||
|
|
days++
|
||
|
|
remainder -= SECS_PER_DAY
|
||
|
|
}
|
||
|
|
|
||
|
|
mut cur_year = 0
|
||
|
|
mut months: [i64] = []
|
||
|
|
mut tmp_days = 0
|
||
|
|
|
||
|
|
let month_tab = [ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]
|
||
|
|
let month_tab_leap = [ -1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]
|
||
|
|
|
||
|
|
tmp_days = days;
|
||
|
|
if tmp_days >= DAYS_PER_LYEAR_PERIOD or tmp_days <= -DAYS_PER_LYEAR_PERIOD {
|
||
|
|
cur_year += YEARS_PER_LYEAR_PERIOD * (tmp_days / DAYS_PER_LYEAR_PERIOD);
|
||
|
|
tmp_days -= DAYS_PER_LYEAR_PERIOD * (tmp_days / DAYS_PER_LYEAR_PERIOD);
|
||
|
|
}
|
||
|
|
while tmp_days >= DAYS_PER_LYEAR {
|
||
|
|
cur_year++;
|
||
|
|
if cur_year % 4 == 0 {
|
||
|
|
tmp_days -= DAYS_PER_LYEAR;
|
||
|
|
} else {
|
||
|
|
tmp_days -= DAYS_PER_YEAR;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if cur_year % 4 == 0 {
|
||
|
|
months = month_tab_leap
|
||
|
|
} else {
|
||
|
|
months = month_tab
|
||
|
|
}
|
||
|
|
|
||
|
|
mut i = 11
|
||
|
|
while i > 0 {
|
||
|
|
if tmp_days > months[i] {
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
i--
|
||
|
|
}
|
||
|
|
|
||
|
|
let year = 1970 + cur_year
|
||
|
|
let month = i + 1
|
||
|
|
let day = tmp_days - months[i]
|
||
|
|
|
||
|
|
let hours = remainder / 3600
|
||
|
|
let minutes = (remainder - hours * 3600) / 60
|
||
|
|
let seconds = remainder % 60
|
||
|
|
|
||
|
|
mut sb = StringBuilder::create()
|
||
|
|
sb.clear()
|
||
|
|
sb.appendff("{:0>4d}-{:0>2d}-{:0>2d}T{:0>2d}:{:0>2d}:{:0>2d}.000Z", year, month, day, hours, minutes, seconds)
|
||
|
|
return sb.to_string()
|
||
|
|
}
|
||
|
|
fn timestamp_from_cdate(anon cdate: i64) -> String {
|
||
|
|
return timestamp_from_unix(cdate_to_unix(cdate))
|
||
|
|
}
|
||
|
|
}
|