zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
"""times module
 
This module provides some Date and Time classes for dealing with MySQL data.
 
Use Python datetime module to handle date and time columns.
"""
from time import localtime
from datetime import date, datetime, time, timedelta
from MySQLdb._mysql import string_literal
 
Date = date
Time = time
TimeDelta = timedelta
Timestamp = datetime
 
DateTimeDeltaType = timedelta
DateTimeType = datetime
 
 
def DateFromTicks(ticks):
    """Convert UNIX ticks into a date instance."""
    return date(*localtime(ticks)[:3])
 
 
def TimeFromTicks(ticks):
    """Convert UNIX ticks into a time instance."""
    return time(*localtime(ticks)[3:6])
 
 
def TimestampFromTicks(ticks):
    """Convert UNIX ticks into a datetime instance."""
    return datetime(*localtime(ticks)[:6])
 
 
format_TIME = format_DATE = str
 
 
def format_TIMEDELTA(v):
    seconds = int(v.seconds) % 60
    minutes = int(v.seconds // 60) % 60
    hours = int(v.seconds // 3600) % 24
    return "%d %d:%d:%d" % (v.days, hours, minutes, seconds)
 
 
def format_TIMESTAMP(d):
    """
    :type d: datetime.datetime
    """
    if d.microsecond:
        fmt = " ".join(
            [
                "{0.year:04}-{0.month:02}-{0.day:02}",
                "{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}",
            ]
        )
    else:
        fmt = " ".join(
            [
                "{0.year:04}-{0.month:02}-{0.day:02}",
                "{0.hour:02}:{0.minute:02}:{0.second:02}",
            ]
        )
    return fmt.format(d)
 
 
def DateTime_or_None(s):
    try:
        if len(s) < 11:
            return Date_or_None(s)
 
        micros = s[20:]
 
        if len(micros) == 0:
            # 12:00:00
            micros = 0
        elif len(micros) < 7:
            # 12:00:00.123456
            micros = int(micros) * 10 ** (6 - len(micros))
        else:
            return None
 
        return datetime(
            int(s[:4]),  # year
            int(s[5:7]),  # month
            int(s[8:10]),  # day
            int(s[11:13] or 0),  # hour
            int(s[14:16] or 0),  # minute
            int(s[17:19] or 0),  # second
            micros,  # microsecond
        )
    except ValueError:
        return None
 
 
def TimeDelta_or_None(s):
    try:
        h, m, s = s.split(":")
        if "." in s:
            s, ms = s.split(".")
            ms = ms.ljust(6, "0")
        else:
            ms = 0
        if h[0] == "-":
            negative = True
        else:
            negative = False
        h, m, s, ms = abs(int(h)), int(m), int(s), int(ms)
        td = timedelta(hours=h, minutes=m, seconds=s, microseconds=ms)
        if negative:
            return -td
        else:
            return td
    except ValueError:
        # unpacking or int/float conversion failed
        return None
 
 
def Time_or_None(s):
    try:
        h, m, s = s.split(":")
        if "." in s:
            s, ms = s.split(".")
            ms = ms.ljust(6, "0")
        else:
            ms = 0
        h, m, s, ms = int(h), int(m), int(s), int(ms)
        return time(hour=h, minute=m, second=s, microsecond=ms)
    except ValueError:
        return None
 
 
def Date_or_None(s):
    try:
        return date(
            int(s[:4]),
            int(s[5:7]),
            int(s[8:10]),
        )  # year  # month  # day
    except ValueError:
        return None
 
 
def DateTime2literal(d, c):
    """Format a DateTime object as an ISO timestamp."""
    return string_literal(format_TIMESTAMP(d))
 
 
def DateTimeDelta2literal(d, c):
    """Format a DateTimeDelta object as a time."""
    return string_literal(format_TIMEDELTA(d))