5
5
from datetime import date
6
6
from datetime import datetime
7
7
8
+ import six
9
+
8
10
import pytz
9
11
from bika .lims import logger
10
12
from DateTime import DateTime
13
+ from DateTime .DateTime import DateError
14
+ from DateTime .DateTime import SyntaxError
15
+ from DateTime .DateTime import TimeError
16
+
17
+
18
+ def is_str (obj ):
19
+ """Check if the given object is a string
20
+
21
+ :param obj: arbitrary object
22
+ :returns: True when the object is a string
23
+ """
24
+ return isinstance (obj , six .string_types )
11
25
12
26
13
27
def is_d (dt ):
@@ -43,6 +57,9 @@ def is_date(dt):
43
57
:param dt: date to check
44
58
:returns: True when the object is either a datetime or DateTime
45
59
"""
60
+ if is_str (dt ):
61
+ DT = to_DT (dt )
62
+ return is_date (DT )
46
63
if is_d (dt ):
47
64
return True
48
65
if is_dt (dt ):
@@ -64,6 +81,9 @@ def is_timezone_naive(dt):
64
81
return dt .timezoneNaive ()
65
82
elif is_dt (dt ):
66
83
return dt .tzinfo is None
84
+ elif is_str (dt ):
85
+ DT = to_DT (dt )
86
+ return is_timezone_naive (DT )
67
87
raise TypeError ("Expected a date, got '%r'" % type (dt ))
68
88
69
89
@@ -84,12 +104,18 @@ def to_DT(dt):
84
104
"""
85
105
if is_DT (dt ):
86
106
return dt
107
+ elif is_str (dt ):
108
+ try :
109
+ return DateTime (dt )
110
+ except (DateError , TimeError , SyntaxError , IndexError ):
111
+ return None
87
112
elif is_dt (dt ):
88
113
return DateTime (dt .isoformat ())
89
114
elif is_d (dt ):
90
115
dt = datetime (dt .year , dt .month , dt .day )
91
116
return DateTime (dt .isoformat ())
92
- raise TypeError ("Expected datetime, got '%r'" % type (dt ))
117
+ else :
118
+ return None
93
119
94
120
95
121
def to_dt (dt ):
@@ -100,11 +126,15 @@ def to_dt(dt):
100
126
"""
101
127
if is_DT (dt ):
102
128
return dt .asdatetime ()
129
+ elif is_str (dt ):
130
+ DT = to_DT (dt )
131
+ return to_dt (DT )
103
132
elif is_dt (dt ):
104
133
return dt
105
134
elif is_d (dt ):
106
135
return datetime (dt .year , dt .month , dt .day )
107
- raise TypeError ("Expected DateTime, got '%r'" % type (dt ))
136
+ else :
137
+ return None
108
138
109
139
110
140
def is_valid_timezone (timezone ):
@@ -155,14 +185,16 @@ def to_zone(dt, timezone):
155
185
:param timezone: timezone
156
186
:returns: date converted to timezone
157
187
"""
158
- if is_dt (dt ):
188
+ if is_dt (dt ) or is_d (dt ):
189
+ dt = to_dt (dt )
159
190
zone = pytz .timezone (timezone )
160
191
if is_timezone_aware (dt ):
161
192
return dt .astimezone (zone )
162
193
return zone .localize (dt )
163
- if is_DT (dt ):
194
+ elif is_DT (dt ):
164
195
# NOTE: This shifts the time according to the TZ offset
165
196
return dt .toZone (timezone )
197
+ raise TypeError ("Expected a date, got '%r'" % type (dt ))
166
198
167
199
168
200
def to_timestamp (dt ):
@@ -176,6 +208,9 @@ def to_timestamp(dt):
176
208
timestamp = dt .timeTime ()
177
209
elif is_dt (dt ):
178
210
timestamp = time .mktime (dt .timetuple ())
211
+ elif is_str (dt ):
212
+ DT = to_DT (dt )
213
+ return to_timestamp (DT )
179
214
return timestamp
180
215
181
216
@@ -185,7 +220,6 @@ def from_timestamp(timestamp):
185
220
:param timestamp: POSIX timestamp
186
221
:returns: datetime object
187
222
"""
188
-
189
223
return datetime .utcfromtimestamp (timestamp )
190
224
191
225
@@ -196,4 +230,7 @@ def to_iso_format(dt):
196
230
return dt .isoformat ()
197
231
elif is_DT (dt ):
198
232
return dt .ISO ()
233
+ elif is_str (dt ):
234
+ DT = to_DT (dt )
235
+ return to_iso_format (DT )
199
236
return None
0 commit comments