-
Notifications
You must be signed in to change notification settings - Fork 5
/
systemtime.go
85 lines (78 loc) · 2.2 KB
/
systemtime.go
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
// Copyright (C) 2018-2023, John Chadwick <john@jchw.io>
//
// Permission to use, copy, modify, and/or distribute this software for any purpose
// with or without fee is hereby granted, provided that the above copyright notice
// and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
// TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
// THIS SOFTWARE.
//
// SPDX-FileCopyrightText: Copyright (c) 2018-2023 John Chadwick
// SPDX-License-Identifier: ISC
package pangya
import "time"
type SystemTime struct {
/* 0x00 */ Year, Month, DayOfWeek, Day uint16
/* 0x08 */ Hour, Minute, Second, Milliseconds uint16
/* 0x10 */
}
func NewSystemTime(t time.Time) SystemTime {
return SystemTime{
Year: uint16(t.Year()),
Month: uint16(t.Month()),
DayOfWeek: uint16(t.Weekday()),
Day: uint16(t.Day()),
Hour: uint16(t.Hour()),
Minute: uint16(t.Minute()),
Second: uint16(t.Second()),
Milliseconds: uint16(t.Nanosecond() / int(time.Millisecond)),
}
}
func (s SystemTime) Time() time.Time {
return time.Date(
int(s.Year),
time.Month(s.Month),
int(s.Day),
int(s.Hour),
int(s.Minute),
int(s.Second),
int(s.Milliseconds)*int(time.Millisecond),
time.UTC,
)
}
func (s SystemTime) IsZero() bool {
return (s.Year == 0 && s.Month == 0 && s.DayOfWeek == 0 && s.Day == 0 &&
s.Hour == 0 && s.Minute == 0 && s.Second == 0 && s.Milliseconds == 0)
}
func (s SystemTime) IsValid() bool {
if s.Year < 1601 || s.Year > 30827 {
return false
}
if s.Month < 1 || s.Month > 12 {
return false
}
if s.DayOfWeek > 6 {
return false
}
if s.Day < 1 || s.Day > 31 {
return false
}
if s.Hour > 23 {
return false
}
if s.Minute > 59 {
return false
}
if s.Second > 59 {
return false
}
if s.Milliseconds > 999 {
return false
}
return true
}