質問編集履歴

3

追記

2018/09/16 05:12

投稿

sequelanonymous
sequelanonymous

スコア123

test CHANGED
File without changes
test CHANGED
@@ -145,3 +145,141 @@
145
145
 
146
146
 
147
147
  何かtips頂けませんでしょうか?
148
+
149
+
150
+
151
+ *補足
152
+
153
+ -
154
+
155
+ ```ここに言語を入力
156
+
157
+ datetime_string
158
+
159
+ ```
160
+
161
+ 日付のstringオブジェクト"2014-09-24T19:14:53.000Z"が入る。
162
+
163
+ UTCのタイムゾーンの持つawareな日付
164
+
165
+
166
+
167
+
168
+
169
+ ```ここに言語を入力
170
+
171
+ dt = parse(datetime_string)
172
+
173
+ ```
174
+
175
+ datetime.datetime(2014, 9, 24, 19, 14, 53, tzinfo=tzutc())
176
+
177
+ stringオブジェクトをUTCのタイムゾーンを持つdatetimeオブジェクトにパースする
178
+
179
+ > 「UTC(協定世界時)」とは、世界各地の標準時を決めるときの基準となる「世界標準時」のことです。たとえば日本の標準時(JST)は「UTC」よりも 9時間進んでいるため「UTC+09:00」と表示されます。
180
+
181
+
182
+
183
+
184
+
185
+ ```ここに言語を入力
186
+
187
+ if dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None:
188
+
189
+ ```
190
+
191
+ datetimeがタイムゾーンをもっているかどうか、つまりawareな日付かnativeな日付かどかをチェックする
192
+
193
+
194
+
195
+ ```ここに言語を入力
196
+
197
+ dt.tzinfo
198
+
199
+
200
+
201
+ 出力結果:
202
+
203
+ tzutc()
204
+
205
+
206
+
207
+ dt.tzinfo.utcoffset(dt)
208
+
209
+
210
+
211
+ 出力結果:
212
+
213
+ datetime.timedelta(0)
214
+
215
+ ```
216
+
217
+ dt.tzinfo.utcoffset(dt)は、UTCとの差とローカルな時間(例えば、JTC、日本時間)との差がどれだけあるかどうかを出力。今回は、UTCのタイムゾーンを持つ日付との差分をだしているため、0と出力されている。
218
+
219
+
220
+
221
+ ```ここに言語を入力
222
+
223
+ (Pdb) p dt.astimezone()
224
+
225
+ datetime.datetime(2014, 9, 25, 4, 14, 53, tzinfo=datetime.timezone(datetime.timedelta(0, 32400), 'JST'))
226
+
227
+
228
+
229
+ (Pdb) p timezone('UTC')
230
+
231
+ <UTC>
232
+
233
+
234
+
235
+ (Pdb) p dt.astimezone(timezone('UTC'))
236
+
237
+ datetime.datetime(2014, 9, 24, 19, 14, 53, tzinfo=<UTC>)
238
+
239
+ ```
240
+
241
+ dt.astimezone()は、ローカルの時間に変換するのため、JSTの時間で8時間ぐらいの差が出力結果にある。
242
+
243
+ 今回は、UTCで最終的には出力したいため、timezoneでUTCになおして出力する。
244
+
245
+
246
+
247
+ ```ここに言語を入力
248
+
249
+ return dt.astimezone(timezone('UTC')).strftime("%Y-%m-%d %H:%M:%S")
250
+
251
+
252
+
253
+ datetime.datetime(2014, 9, 24, 19, 14, 53, tzinfo=<UTC>)は、
254
+
255
+ データベースに入った後は、マイクロ秒まではいってします。
256
+
257
+ 2014-09-24 19:14:53.000000|
258
+
259
+ ```
260
+
261
+ ここで、問題、.strftime("%Y-%m-%d %H:%M:%S")はマイクロ秒を落とすためにstringオブジェクトになおして整形している。しかし、データベースのモデル定義は、datatimeであるため、insertすることができない。
262
+
263
+
264
+
265
+ 以下、2つの方法を探る必要がある。
266
+
267
+ 方法1:データベースのモデルをマイクロ秒までいれないように何か定義をし直すことができるかを探る。
268
+
269
+ 方法2: datetimeのまま、整形できるような関数や方法を探る。
270
+
271
+
272
+
273
+ *日付に関わる役立つURL
274
+
275
+ -
276
+
277
+ https://torina.top/detail/338/
278
+
279
+ https://uxmilk.jp/12626
280
+
281
+ https://qiita.com/takaki@github/items/b1a380a0a644170f5885
282
+
283
+ https://docs.python.org/ja/3/library/datetime.html
284
+
285
+ https://qiita.com/takaki@github/items/b1a380a0a644170f5885

2

追記

2018/09/16 05:12

投稿

sequelanonymous
sequelanonymous

スコア123

test CHANGED
File without changes
test CHANGED
@@ -98,6 +98,38 @@
98
98
 
99
99
  ```ここに言語を入力
100
100
 
101
+ def parse_datetime(datetime_string):
102
+
103
+ if datetime_string is not None:
104
+
105
+ dt = parse(datetime_string)
106
+
107
+
108
+
109
+ if dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None:
110
+
111
+ print(datetime_string+" is aware.")
112
+
113
+ return dt.astimezone(timezone('UTC')).strftime("%Y-%m-%d %H:%M:%S")
114
+
115
+ else:
116
+
117
+ print(datetime_string+" is native.")
118
+
119
+ return dt.strftime("%Y-%m-%d %H:%M:%S")
120
+
121
+ return None
122
+
123
+
124
+
125
+
126
+
127
+ ```
128
+
129
+
130
+
131
+ ```ここに言語を入力
132
+
101
133
 
102
134
 
103
135
  start_time = parse_datetime(events.get("_time"))

1

ついい

2018/09/15 04:13

投稿

sequelanonymous
sequelanonymous

スコア123

test CHANGED
File without changes
test CHANGED
@@ -79,3 +79,37 @@
79
79
  assert res[1] == func[1]
80
80
 
81
81
  ```
82
+
83
+
84
+
85
+ *追記
86
+
87
+
88
+
89
+ 上記コードは、自分で試してたどり着いたコードであり、本来の問題は、isoformatでjsonを送れないという問題でつまづいていました。 "time_":"2014-09-24T19:14:53.000Z",のようにJSONに記述してpostリクエストを送る場合です。
90
+
91
+
92
+
93
+ ただ、それを実行するとsqlalchemy.exc.StatementError: (builtins.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input. というエラーで怒られてしまいます。
94
+
95
+
96
+
97
+ python側の受け取り方はこのようなコードです。
98
+
99
+ ```ここに言語を入力
100
+
101
+
102
+
103
+ start_time = parse_datetime(events.get("_time"))
104
+
105
+
106
+
107
+ ```
108
+
109
+
110
+
111
+ datetimeをserializeできれば、この問題を解決できるかと思いご回答頂きましたが、下記でご教示頂いたやり方を実行してみましたが、上記のようなエラーがででpythonで受け取れないようです。
112
+
113
+
114
+
115
+ 何かtips頂けませんでしょうか?