teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

追記

2018/09/16 05:12

投稿

sequelanonymous
sequelanonymous

スコア123

title CHANGED
File without changes
body CHANGED
@@ -71,4 +71,73 @@
71
71
 
72
72
  datetimeをserializeできれば、この問題を解決できるかと思いご回答頂きましたが、下記でご教示頂いたやり方を実行してみましたが、上記のようなエラーがででpythonで受け取れないようです。
73
73
 
74
- 何かtips頂けませんでしょうか?
74
+ 何かtips頂けませんでしょうか?
75
+
76
+ *補足
77
+ -
78
+ ```ここに言語を入力
79
+ datetime_string
80
+ ```
81
+ 日付のstringオブジェクト"2014-09-24T19:14:53.000Z"が入る。
82
+ UTCのタイムゾーンの持つawareな日付
83
+
84
+
85
+ ```ここに言語を入力
86
+ dt = parse(datetime_string)
87
+ ```
88
+ datetime.datetime(2014, 9, 24, 19, 14, 53, tzinfo=tzutc())
89
+ stringオブジェクトをUTCのタイムゾーンを持つdatetimeオブジェクトにパースする
90
+ > 「UTC(協定世界時)」とは、世界各地の標準時を決めるときの基準となる「世界標準時」のことです。たとえば日本の標準時(JST)は「UTC」よりも 9時間進んでいるため「UTC+09:00」と表示されます。
91
+
92
+
93
+ ```ここに言語を入力
94
+ if dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None:
95
+ ```
96
+ datetimeがタイムゾーンをもっているかどうか、つまりawareな日付かnativeな日付かどかをチェックする
97
+
98
+ ```ここに言語を入力
99
+ dt.tzinfo
100
+
101
+ 出力結果:
102
+ tzutc()
103
+
104
+ dt.tzinfo.utcoffset(dt)
105
+
106
+ 出力結果:
107
+ datetime.timedelta(0)
108
+ ```
109
+ dt.tzinfo.utcoffset(dt)は、UTCとの差とローカルな時間(例えば、JTC、日本時間)との差がどれだけあるかどうかを出力。今回は、UTCのタイムゾーンを持つ日付との差分をだしているため、0と出力されている。
110
+
111
+ ```ここに言語を入力
112
+ (Pdb) p dt.astimezone()
113
+ datetime.datetime(2014, 9, 25, 4, 14, 53, tzinfo=datetime.timezone(datetime.timedelta(0, 32400), 'JST'))
114
+
115
+ (Pdb) p timezone('UTC')
116
+ <UTC>
117
+
118
+ (Pdb) p dt.astimezone(timezone('UTC'))
119
+ datetime.datetime(2014, 9, 24, 19, 14, 53, tzinfo=<UTC>)
120
+ ```
121
+ dt.astimezone()は、ローカルの時間に変換するのため、JSTの時間で8時間ぐらいの差が出力結果にある。
122
+ 今回は、UTCで最終的には出力したいため、timezoneでUTCになおして出力する。
123
+
124
+ ```ここに言語を入力
125
+ return dt.astimezone(timezone('UTC')).strftime("%Y-%m-%d %H:%M:%S")
126
+
127
+ datetime.datetime(2014, 9, 24, 19, 14, 53, tzinfo=<UTC>)は、
128
+ データベースに入った後は、マイクロ秒まではいってします。
129
+ 2014-09-24 19:14:53.000000|
130
+ ```
131
+ ここで、問題、.strftime("%Y-%m-%d %H:%M:%S")はマイクロ秒を落とすためにstringオブジェクトになおして整形している。しかし、データベースのモデル定義は、datatimeであるため、insertすることができない。
132
+
133
+ 以下、2つの方法を探る必要がある。
134
+ 方法1:データベースのモデルをマイクロ秒までいれないように何か定義をし直すことができるかを探る。
135
+ 方法2: datetimeのまま、整形できるような関数や方法を探る。
136
+
137
+ *日付に関わる役立つURL
138
+ -
139
+ https://torina.top/detail/338/
140
+ https://uxmilk.jp/12626
141
+ https://qiita.com/takaki@github/items/b1a380a0a644170f5885
142
+ https://docs.python.org/ja/3/library/datetime.html
143
+ https://qiita.com/takaki@github/items/b1a380a0a644170f5885

2

追記

2018/09/16 05:12

投稿

sequelanonymous
sequelanonymous

スコア123

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,23 @@
48
48
 
49
49
  python側の受け取り方はこのようなコードです。
50
50
  ```ここに言語を入力
51
+ def parse_datetime(datetime_string):
52
+ if datetime_string is not None:
53
+ dt = parse(datetime_string)
51
54
 
55
+ if dt.tzinfo is not None and dt.tzinfo.utcoffset(dt) is not None:
56
+ print(datetime_string+" is aware.")
57
+ return dt.astimezone(timezone('UTC')).strftime("%Y-%m-%d %H:%M:%S")
58
+ else:
59
+ print(datetime_string+" is native.")
60
+ return dt.strftime("%Y-%m-%d %H:%M:%S")
61
+ return None
62
+
63
+
64
+ ```
65
+
66
+ ```ここに言語を入力
67
+
52
68
  start_time = parse_datetime(events.get("_time"))
53
69
 
54
70
  ```

1

ついい

2018/09/15 04:13

投稿

sequelanonymous
sequelanonymous

スコア123

title CHANGED
File without changes
body CHANGED
@@ -38,4 +38,21 @@
38
38
  res = jsonify({'message': 'error', 'result': 201}), 201
39
39
  assert res[0].json == func[0].json
40
40
  assert res[1] == func[1]
41
- ```
41
+ ```
42
+
43
+ *追記
44
+
45
+ 上記コードは、自分で試してたどり着いたコードであり、本来の問題は、isoformatでjsonを送れないという問題でつまづいていました。 "time_":"2014-09-24T19:14:53.000Z",のようにJSONに記述してpostリクエストを送る場合です。
46
+
47
+ ただ、それを実行するとsqlalchemy.exc.StatementError: (builtins.TypeError) SQLite DateTime type only accepts Python datetime and date objects as input. というエラーで怒られてしまいます。
48
+
49
+ python側の受け取り方はこのようなコードです。
50
+ ```ここに言語を入力
51
+
52
+ start_time = parse_datetime(events.get("_time"))
53
+
54
+ ```
55
+
56
+ datetimeをserializeできれば、この問題を解決できるかと思いご回答頂きましたが、下記でご教示頂いたやり方を実行してみましたが、上記のようなエラーがででpythonで受け取れないようです。
57
+
58
+ 何かtips頂けませんでしょうか?