5
5
# current users of api2 to install new modules and modify PYTHONPATH info.
6
6
# ----------------------------------------------------------------------------
7
7
8
+ from datetime import tzinfo , timedelta , datetime
9
+ import time as _time
10
+
8
11
class SgTimezone (object ):
9
- from datetime import tzinfo , timedelta , datetime
10
- import time as _time
12
+ '''
13
+ Shotgun's server infrastructure is configured for Coordinated Universal
14
+ Time (UTC). In order to provide relevant local timestamps to users, we wrap
15
+ the datetime module's tzinfo to provide convenient conversion methods.
16
+ '''
11
17
12
18
ZERO = timedelta (0 )
13
19
STDOFFSET = timedelta (seconds = - _time .timezone )
@@ -18,41 +24,76 @@ class SgTimezone(object):
18
24
DSTDIFF = DSTOFFSET - STDOFFSET
19
25
20
26
def __init__ (self ):
21
- self .utc = self .UTC ()
22
- self .local = self .LocalTimezone ()
27
+ self .utc = UTC ()
28
+ self .local = LocalTimezone ()
29
+
30
+ @classmethod
31
+ def UTC (cls ):
32
+ '''
33
+ For backwards compatibility, from when UTC was a nested class,
34
+ we allow instantiation via SgTimezone
35
+ '''
36
+ return UTC ()
37
+
38
+ @classmethod
39
+ def LocalTimezone (cls ):
40
+ '''
41
+ For backwards compatibility, from when LocalTimezone was a nested
42
+ class, we allow instantiation via SgTimezone
43
+ '''
44
+ return LocalTimezone ()
23
45
24
- class UTC (tzinfo ):
25
-
26
- def utcoffset (self , dt ):
27
- return SgTimezone .ZERO
28
-
29
- def tzname (self , dt ):
30
- return "UTC"
31
-
32
- def dst (self , dt ):
33
- return SgTimezone .ZERO
46
+ class UTC (tzinfo ):
47
+ '''
48
+ Implementation of datetime's tzinfo to provide consistent calculated
49
+ offsets against Coordinated Universal Time (UTC)
50
+ '''
51
+
52
+ def utcoffset (self , dt ):
53
+ return SgTimezone .ZERO
34
54
35
- class LocalTimezone (tzinfo ):
36
-
37
- def utcoffset (self , dt ):
38
- if self ._isdst (dt ):
39
- return SgTimezone .DSTOFFSET
40
- else :
41
- return SgTimezone .STDOFFSET
42
-
43
- def dst (self , dt ):
44
- if self ._isdst (dt ):
45
- return SgTimezone .DSTDIFF
46
- else :
47
- return SgTimezone .ZERO
48
-
49
- def tzname (self , dt ):
50
- return _time .tzname [self ._isdst (dt )]
51
-
52
- def _isdst (self , dt ):
53
- tt = (dt .year , dt .month , dt .day , dt .hour , dt .minute , dt .second , dt .weekday (), 0 , - 1 )
54
- import time as _time
55
- stamp = _time .mktime (tt )
56
- tt = _time .localtime (stamp )
57
- return tt .tm_isdst > 0
55
+ def tzname (self , dt ):
56
+ return "UTC"
57
+
58
+ def dst (self , dt ):
59
+ return SgTimezone .ZERO
58
60
61
+ class LocalTimezone (tzinfo ):
62
+ '''
63
+ Implementation of datetime's tzinfo to provide convenient conversion
64
+ between Shotgun server time and local user time
65
+ '''
66
+
67
+ def utcoffset (self , dt ):
68
+ '''
69
+ Difference between the user's local timezone and UTC timezone in seconds
70
+ '''
71
+ if self ._isdst (dt ):
72
+ return SgTimezone .DSTOFFSET
73
+ else :
74
+ return SgTimezone .STDOFFSET
75
+
76
+ def dst (self , dt ):
77
+ '''
78
+ Daylight savings time (dst) offset in seconds
79
+ '''
80
+ if self ._isdst (dt ):
81
+ return SgTimezone .DSTDIFF
82
+ else :
83
+ return SgTimezone .ZERO
84
+
85
+ def tzname (self , dt ):
86
+ '''
87
+ Name of the user's local timezone, including a reference
88
+ to daylight savings time (dst) if applicable
89
+ '''
90
+ return _time .tzname [self ._isdst (dt )]
91
+
92
+ def _isdst (self , dt ):
93
+ '''
94
+ Calculate whether the timestamp in question was in daylight savings
95
+ '''
96
+ tt = (dt .year , dt .month , dt .day , dt .hour , dt .minute , dt .second , dt .weekday (), 0 , - 1 )
97
+ stamp = _time .mktime (tt )
98
+ tt = _time .localtime (stamp )
99
+ return tt .tm_isdst > 0
0 commit comments