- Notifications
You must be signed in to change notification settings - Fork 1k
/
Copy pathtime.py
95 lines (69 loc) · 1.81 KB
/
time.py
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
86
87
88
89
90
91
92
93
94
95
fromutimeimport*
fromcollectionsimportnamedtuple
importstruct
importuctypes
importffi
importffilib
importarray
libc=ffilib.libc()
# struct tm *gmtime(const time_t *timep);
# struct tm *localtime(const time_t *timep);
# size_t strftime(char *s, size_t max, const char *format,
# const struct tm *tm);
gmtime_=libc.func("P", "gmtime", "P")
localtime_=libc.func("P", "localtime", "P")
strftime_=libc.func("i", "strftime", "sisP")
mktime_=libc.func("i", "mktime", "P")
_struct_time=namedtuple(
"struct_time",
[
"tm_year",
"tm_mon",
"tm_mday",
"tm_hour",
"tm_min",
"tm_sec",
"tm_wday",
"tm_yday",
"tm_isdst",
],
)
def_tuple_to_c_tm(t):
returnstruct.pack(
"@iiiiiiiii", t[5], t[4], t[3], t[2], t[1] -1, t[0] -1900, (t[6] +1) %7, t[7] -1, t[8]
)
def_c_tm_to_tuple(tm):
t=struct.unpack("@iiiiiiiii", tm)
return_struct_time(
t[5] +1900, t[4] +1, t[3], t[2], t[1], t[0], (t[6] -1) %7, t[7] +1, t[8]
)
defstruct_time(tm):
return_struct_time(*tm)
defstrftime(format, t=None):
iftisNone:
t=localtime()
buf=bytearray(32)
l=strftime_(buf, 32, format, _tuple_to_c_tm(t))
returnstr(buf[:l], "utf-8")
deflocaltime(t=None):
iftisNone:
t=time()
t=int(t)
a=struct.pack("l", t)
tm_p=localtime_(a)
return_c_tm_to_tuple(uctypes.bytearray_at(tm_p, 36))
defgmtime(t=None):
iftisNone:
t=time()
t=int(t)
a=struct.pack("l", t)
tm_p=gmtime_(a)
return_c_tm_to_tuple(uctypes.bytearray_at(tm_p, 36))
defmktime(tt):
returnmktime_(_tuple_to_c_tm(tt))
defperf_counter():
returntime()
defprocess_time():
returnclock()
daylight=0
timezone=0