書くこと
AWS Service Health DashboardのRSSの中の日付をJSTに変換してみる。
下記のRSSフィードの中を見てみると、投稿日時が以下のような形式で書かれている。(Asia/TokyoリージョンのELBのステータス)
https://status.aws.amazon.com/rss/elb-ap-northeast-1.rss
Fri, 19 Feb 2021 09:27:00 PST
Sun, 18 Oct 2015 22:44:31 PDT
AWS Service Health Dashboardのページから、「Asia/Tokyo」タブをクリックし、「Amazon Elastic Load Balancing (Tokyo)」の行のRSSアイコンをクリックした中にある日付。
これを最終的に、下記のような日付フォーマットに変換することが目的だ。
2021-02-20 02:27:00
2015-10-19 14:44:31
なぜこんなことをするか
AWS Service Health DashboardのRSSは、RSSリーダーを使用しないと更新をチェックできない。つまり、メールなどで一斉に通知できない。
そのため、仕方なくPythonプログラムでRSSの更新をチェックし、所属する会社を問わず関係者に一斉に通知する仕組みを実装することになった。(そんな機会に恵まれた)
まあつまり、RSSリーダーを共有できない関係者の間で、AWSの障害情報を同時に受信できる仕組みを作った、というわけ。
このとき困ったのが、RSS上の日付だ。
AWS Service Health DashboardのRSSの日付は、前述したが「PST」と「PDT」がある。
そしてこいつらには時差がある。
PSTはUTC – 8時間
PDTはUTC – 7時間
この時差がやっかいだった。
RSSの更新を通知するPythonは別の記事で紹介するが、プログラムの中で最終的に、今とRSSの日時の差を計算する必要があった。
なので今回の記事を書くに至った。
書いたプログラム
全貌
さて、肝心なプログラムであるが、まずすべて書いてみると以下のようになる。
import datetime
date_org1 = "Fri, 19 Feb 2021 09:27:00 PST"
date_org2 = "Sun, 18 Oct 2015 22:44:31 PDT"
def Change_to_JST(date_txt):
date_split = date_txt.split(",")
date_array = date_split[1].split(" ")
date_MM = date_array[3] + "-" + date_array[2] + "-" + date_array[1] + " " + date_array[4]
date_mm = datetime.datetime.strptime(date_MM, "%Y-%b-%d %H:%M:%S")
if date_array[5] == "PST":
delta_hours = datetime.timedelta(hours = 17)
date_jst = date_mm + delta_hours
print(date_jst)
elif date_array[5] == "PDT":
delta_hours = datetime.timedelta(hours = 16)
date_jst = date_mm + delta_hours
print(date_jst)
Change_to_JST(date_org1)
Change_to_JST(date_org2)
実行結果は以下になる。
2021-02-20 02:27:00
2015-10-19 14:44:31
解説
date_split = date_txt.split(",")
上の部分では以下の変換をしている。
“Fri, 19 Feb 2021 09:27:00 PST” → [‘Fri’, ‘ 19 Feb 2021 09:27:00 PST’]
“Sun, 18 Oct 2015 22:44:31 PDT” → [‘Sun’, ‘ 18 Oct 2015 22:44:31 PDT’]
やっていることは、「,」(カンマ)を区切って配列とすること。(ひとつの配列の中に2つの要素ができている)
date_array = date_split[1].split(" ")
上の部分では以下の変換をしている。
[‘Fri’, ‘ 19 Feb 2021 09:27:00 PST’] → [”, ’19’, ‘Feb’, ‘2021’, ’09:27:00′, ‘PST’]
[‘Sun’, ‘ 18 Oct 2015 22:44:31 PDT’] → [”, ’18’, ‘Oct’, ‘2015’, ’22:44:31′, ‘PDT’]
やっていることは、空白で区切って配列とすること。これにより、ひとつ目の要素であった曜日(’Fri’と’Sun’)は消え、2つ目の要素が空白で区切られて新たな配列となる。
date_MM = date_array[3] + "-" + date_array[2] + "-" + date_array[1] + " " + date_array[4]
上の部分では以下の変換をしている。
[”, ’19’, ‘Feb’, ‘2021’, ’09:27:00′, ‘PST’] → 2021-Feb-19 09:27:00
[”, ’18’, ‘Oct’, ‘2015’, ’22:44:31′, ‘PDT’] → 2015-Oct-18 22:44:31
やっていることは、「YYYY-英語月-DD HH:MI:SS」の形式とすること。配列の中から要素を取り出して、「-」(ハイフン)や空白でつなぎ合わせている。
date_mm = datetime.datetime.strptime(date_MM, "%Y-%b-%d %H:%M:%S")
上の部分では以下の変換をしている。
2021-Feb-19 09:27:00 → 2021-02-19 09:27:00
2015-Oct-18 22:44:31 → 2015-10-18 22:44:31
やっていることは、「YYYY-MM-DD HH:MI:SS」の形式すること。ひとつ前の「YYYY-英語月-DD HH:MI:SS」の形式まで変換できれば、あとはstrptimeでフォーマットを指定して変換できる。
if date_array[5] == "PST":
delta_hours = datetime.timedelta(hours = 17)
date_jst = date_mm + delta_hours
print(date_jst)
elif date_array[5] == "PDT":
delta_hours = datetime.timedelta(hours = 16)
date_jst = date_mm + delta_hours
print(date_jst)
上の部分ではまず、[”, ’19’, ‘Feb’, ‘2021’, ’09:27:00′, ‘PST’]や[”, ’18’, ‘Oct’, ‘2015’, ’22:44:31′, ‘PDT’]が格納されているdate_array変数の5番目(PSTまたはPDT)をif文で判定する。
判定後、JSTとの時差を計算してdelta_hoursに格納する。(JSTは「UTC +9時間」。そのため、PSTとは17時間、PDTとは16時間の時差がある)
そして最後に、2021-02-19 09:27:00や2015-10-18 22:44:31が格納されているdate_mm変数に、時差(delta_hours)を足してJSTを求める。
あとがき
あまり使わねえだろうな。。。(書きながら思ってたけど)
配列となっている日付(RSSの日付)をdatetimeで扱えるようにすることが本記事の目的。
datetimeで扱えるようにすることができれば、JSTへの変換も簡単にできるので、日本時間に変換したい、といういざというときには多少使えるかと。(そう考えたい)
次回は、AWS Service Health Dashboardの更新をメールで一斉通知する仕組みを書きたいと思います。(AWS Service Health Dashboardに「サブスクライブしてメールで受信する」という機能がまだないからさ)
コメント