Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1"""times module 

2 

3This module provides some Date and Time classes for dealing with MySQL data. 

4 

5Use Python datetime module to handle date and time columns. 

6""" 

7from time import localtime 

8from datetime import date, datetime, time, timedelta 

9from MySQLdb._mysql import string_literal 

10 

11Date = date 

12Time = time 

13TimeDelta = timedelta 

14Timestamp = datetime 

15 

16DateTimeDeltaType = timedelta 

17DateTimeType = datetime 

18 

19 

20def DateFromTicks(ticks): 

21 """Convert UNIX ticks into a date instance.""" 

22 return date(*localtime(ticks)[:3]) 

23 

24 

25def TimeFromTicks(ticks): 

26 """Convert UNIX ticks into a time instance.""" 

27 return time(*localtime(ticks)[3:6]) 

28 

29 

30def TimestampFromTicks(ticks): 

31 """Convert UNIX ticks into a datetime instance.""" 

32 return datetime(*localtime(ticks)[:6]) 

33 

34 

35format_TIME = format_DATE = str 

36 

37 

38def format_TIMEDELTA(v): 

39 seconds = int(v.seconds) % 60 

40 minutes = int(v.seconds // 60) % 60 

41 hours = int(v.seconds // 3600) % 24 

42 return "%d %d:%d:%d" % (v.days, hours, minutes, seconds) 

43 

44 

45def format_TIMESTAMP(d): 

46 """ 

47 :type d: datetime.datetime 

48 """ 

49 if d.microsecond: 

50 fmt = " ".join( 

51 [ 

52 "{0.year:04}-{0.month:02}-{0.day:02}", 

53 "{0.hour:02}:{0.minute:02}:{0.second:02}.{0.microsecond:06}", 

54 ] 

55 ) 

56 else: 

57 fmt = " ".join( 

58 [ 

59 "{0.year:04}-{0.month:02}-{0.day:02}", 

60 "{0.hour:02}:{0.minute:02}:{0.second:02}", 

61 ] 

62 ) 

63 return fmt.format(d) 

64 

65 

66def DateTime_or_None(s): 

67 try: 

68 if len(s) < 11: 

69 return Date_or_None(s) 

70 

71 micros = s[20:] 

72 

73 if len(micros) == 0: 

74 # 12:00:00 

75 micros = 0 

76 elif len(micros) < 7: 

77 # 12:00:00.123456 

78 micros = int(micros) * 10 ** (6 - len(micros)) 

79 else: 

80 return None 

81 

82 return datetime( 

83 int(s[:4]), # year 

84 int(s[5:7]), # month 

85 int(s[8:10]), # day 

86 int(s[11:13] or 0), # hour 

87 int(s[14:16] or 0), # minute 

88 int(s[17:19] or 0), # second 

89 micros, # microsecond 

90 ) 

91 except ValueError: 

92 return None 

93 

94 

95def TimeDelta_or_None(s): 

96 try: 

97 h, m, s = s.split(":") 

98 if "." in s: 

99 s, ms = s.split(".") 

100 ms = ms.ljust(6, "0") 

101 else: 

102 ms = 0 

103 if h[0] == "-": 

104 negative = True 

105 else: 

106 negative = False 

107 h, m, s, ms = abs(int(h)), int(m), int(s), int(ms) 

108 td = timedelta(hours=h, minutes=m, seconds=s, microseconds=ms) 

109 if negative: 

110 return -td 

111 else: 

112 return td 

113 except ValueError: 

114 # unpacking or int/float conversion failed 

115 return None 

116 

117 

118def Time_or_None(s): 

119 try: 

120 h, m, s = s.split(":") 

121 if "." in s: 

122 s, ms = s.split(".") 

123 ms = ms.ljust(6, "0") 

124 else: 

125 ms = 0 

126 h, m, s, ms = int(h), int(m), int(s), int(ms) 

127 return time(hour=h, minute=m, second=s, microsecond=ms) 

128 except ValueError: 

129 return None 

130 

131 

132def Date_or_None(s): 

133 try: 

134 return date( 

135 int(s[:4]), 

136 int(s[5:7]), 

137 int(s[8:10]), 

138 ) # year # month # day 

139 except ValueError: 

140 return None 

141 

142 

143def DateTime2literal(d, c): 

144 """Format a DateTime object as an ISO timestamp.""" 

145 return string_literal(format_TIMESTAMP(d)) 

146 

147 

148def DateTimeDelta2literal(d, c): 

149 """Format a DateTimeDelta object as a time.""" 

150 return string_literal(format_TIMEDELTA(d))