電子書籍の厳選無料作品が豊富!

フォーマットが異なる二つの日時、 "Tue Aug 4 11:10:14 PDT 2015” と "Tue, 04 Aug 2015 11:10:14 -0700” を Unix Epoch に変換する必要があります。以下のテストプログラムではどちらの時刻フォーマットからも同じ Epoch を得ることができました。

# cat time.py
# -*- coding: utf-8 -*-
import time
import datetime
import dateutil.parser
d = "Tue Aug 4 11:10:14 PDT 2015"
d = dateutil.parser.parse(d)
print int(time.mktime(d.timetuple()))
e = "Tue, 04 Aug 2015 11:10:14 -0700"
e = dateutil.parser.parse(e)
print int(time.mktime(d.timetuple()))

# python time.py
1438683014
1438683014

同テストプログラムをメインのプログラムに組み込んで、後者のフォーマットの時刻を Epoch に変換すると、異なる Epoch が返ってきます。

def datetime_to_epoch(self, d):
d = dateutil.parser.parse(d)
return int(time.mktime(d.timetuple()))

ihTime = xmlRoot.find(".//g_date").text
logger.debug("g_date:'%s'", ihTime)
# Convert this format "Tue, 04 Aug 2015 11:10:14 -0700" to Unix epoch
ihTime = self.datetime_to_epoch(ihTime)
self.qDate.append(ihTime)
logger.debug("Appending generated time: %s", ihTime)

実行結果
# python test.py
...
generation_date:'Tue, 04 Aug 2015 11:10:14 -0700'
Appending generated time: 1438686614

xml から取得している文字列が想定と異なっているのかと疑い、下記のように
ihTime に直接後者の時刻を入れてみたのですが結果は変わりませんでした。
ihTime に想定外の値が入っているという事では無いようです。

ihTime = xmlRoot.find(".//g_date").text
logger.debug("g_date:'%s'", ihTime)
# Convert this format "Tue, 04 Aug 2015 11:10:14 -0700" to Unix epoch
ihTime = "Tue, 04 Aug 2015 11:10:14 -0700”
ihTime = self.datetime_to_epoch(ihTime)
self.qDate.append(ihTime)
logger.debug("Appending generated time: %s", ihTime)

得られた Epoch
1438686614

同様の方法で前者のフォーマットデータを直接 ihTime に入れて実行すると、
最初の time.py と同じ結果が得られます。

ihTime = xmlRoot.find(".//g_date").text
logger.debug("g_date:'%s'", ihTime)
# Convert this format "Tue, 04 Aug 2015 11:10:14 -0700" to Unix epoch
ihTime = "Tue Aug 4 11:10:14 PDT 2015”
ihTime = self.datetime_to_epoch(ihTime)
self.qDate.append(ihTime)
logger.debug("Appending generated time: %s", ihTime)

得られた Epoch
1438683014


二つの Epoch を再変換してみると、後者のメインプログラム&フォーマットで得られる Epoch は1時間時刻が進んでいるようです。

~# date --date "@1438683014"
Tue Aug 4 11:10:14 BST 2015
~# date --date "@1438686614"
Tue Aug 4 12:10:14 BST 2015


メインプログラムで後者のフォーマットの時刻を与えた場合のみ結果が異なる点について、
確認すべきことがありましたらご指摘いただけないでしょうか。
もし dateutil の使い方自体が間違っている様でしたら適切な Epoch への変換方法を教えていただけると嬉しいです。

宜しくお願いします。

A 回答 (2件)

e = "Tue, 04 Aug 2015 11:10:14 -0700"


e = dateutil.parser.parse(e)
print int(time.mktime(d.timetuple()))

本当にこの通りなら、2つ目は e のepochにはなっていません。
    • good
    • 0
この回答へのお礼

お返事ありがとうございました。ご指摘ありがとうございます、test.py では期待する動作が得られていると勘違いしていました。。。結果、メインプログラム側に何か問題があるのだろうと思い込んでしまっていました。

ご指摘をいただいたあと、dateutil を調べて以下の様にすることで PDT や -0700 を無視した epoch を得る事ができました。

d = dateutil.parser.parse(d, ignoretz=True)

お礼日時:2015/10/03 04:40

最初のロジックの結果が同じになったのは思い込みです。

(ロジックが間違ってます)
-0700とPDTは同じUTC-7ですが、最後のdateコマンドの出力結果がBST(UTC+1)なことから、-0700と指定した場合とPDT(タイムゾーン)を指定した場合で動作が異なるように思えます。というか-0700という記述のしかたは可能?UTC-7と記述してみては?
「python : unix epoch 」の回答画像2
    • good
    • 0
この回答へのお礼

お返事ありがとうございました。

ご指摘のとおりテストプログラム自体が誤っていて、その誤った結果をもとにメインプログラム側を疑ってしまっていました。。

大変丁寧な回答をいただいたのに恐縮ですが、問題解決のきっかけになった最初の方に BA をつけさせていただきました。

ありがとうございました。

お礼日時:2015/10/03 04:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!