v/time/time.v

108 lines
2.2 KiB
Go
Raw Normal View History

2019-06-23 04:21:30 +02:00
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license
// that can be found in the LICENSE file.
2019-06-22 20:20:28 +02:00
module time
#include <time.h>
2019-06-27 12:02:47 +02:00
struct Time {
sec i64
nsec i32
mono i64
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (a Time) + (b Time) Time {
sec := a.sec + b.sec
nsec := a.nsec + b.nsec
return Time{
sec: sec + i64(nsec)/i64(1000000000)
nsec: nsec % i32(1000000000)
2019-06-22 20:20:28 +02:00
}
}
2019-06-27 12:02:47 +02:00
fn (a Time) - (b Time) Time {
sec := a.sec - b.sec - i64(1)
nsec := a.nsec - b.nsec + i32(1000000000)
t := Time{
sec: sec + i64(nsec)/i64(1000000000)
nsec: nsec % i32(1000000000)
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
if a.mono <= i64(0) || b.mono <= i64(0) {
return t
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
mono := a.mono - b.mono
if mono > i64(0) && t.sec >= i64(0) && t.nsec >= i32(0) {
return t
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
if mono < i64(0) && t.sec <= i64(0) && t.nsec <= i32(0) {
return t
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
if mono == i64(0) {
return Time{}
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
return Time{
sec: mono / i64(1000000000)
nsec: i32(mono%i64(1000000000))
2019-06-22 20:20:28 +02:00
}
}
2019-06-27 12:02:47 +02:00
fn (t Time) days() f64 {
return f64(t.sec)/86400.0
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (t Time) hours() f64 {
return f64(t.sec)/3600.0
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (t Time) minutes() f64 {
return f64(t.sec)/60.0
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (t Time) seconds() f64 {
return f64(t.sec) + f64(t.nsec)/1000000000.0
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (t Time) milliseconds() f64 {
return 1000.0*f64(t.sec) + f64(t.nsec)/1000000.0
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (t Time) microseconds() f64 {
return 1000000.0*f64(t.sec) + f64(t.nsec)/1000.0
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (t Time) nanoseconds() f64 {
return 1000000000.0*f64(t.sec) + f64(t.nsec)
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
fn (t Time) str() string {
if t.sec == i64(0) {
if t.nsec == i32(0) {
return '0s'
}
if t.nsec < i32(1000) && t.nsec > i32(-1000) {
return '${t.nsec}ns'
}
if t.nsec < i32(1000000) && t.nsec > i32(-1000000) {
return '${f64(t.nsec)/1000.0:.1f}µs'
}
if t.nsec < i32(1000000000) && t.nsec > i32(-1000000000) {
return '${f64(t.nsec)/1000000.0:.1f}ms'
}
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
if t.sec < i64(60) && t.sec > i64(-60) {
return '${f64(t.sec)+f64(t.nsec)/1000000000.0:.1f}s'
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
if t.sec < i64(3600) && t.sec > i64(-3600) {
return '${f64(t.sec)/60.0:.1f}m'
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
if t.sec < i64(86400) && t.sec > i64(-86400) {
return '${f64(t.sec)/3600.0:.1f}h'
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
if t.sec < i64(864000) && t.sec > i64(-864000) {
return '${f64(t.sec)/86400.0:.1f}d'
2019-06-22 20:20:28 +02:00
}
2019-06-27 12:02:47 +02:00
return '${f64(t.sec)/86400.0:.0f}d'
2019-06-23 21:18:24 +02:00
}