【Python】RSSの配列の日付をJTCに変換する方法を考えた

書くこと

AWS Service Health DashboardRSSの中の日付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:002015-10-18 22:44:31が格納されているdate_mm変数に、時差(delta_hours)を足してJSTを求める。

あとがき

あまり使わねえだろうな。。。(書きながら思ってたけど)

配列となっている日付(RSSの日付)をdatetimeで扱えるようにすることが本記事の目的。

datetimeで扱えるようにすることができれば、JSTへの変換も簡単にできるので、日本時間に変換したい、といういざというときには多少使えるかと。(そう考えたい)

次回は、AWS Service Health Dashboardの更新をメールで一斉通知する仕組みを書きたいと思います。(AWS Service Health Dashboardに「サブスクライブしてメールで受信する」という機能がまだないからさ)

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!

コメント

コメントする

CAPTCHA