質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

4880閲覧

Python3にてUTCの時刻からエポック秒に変換する方法

sabx

総合スコア200

DateTime

多くのプログラミング言語におけるDateTimeオブジェクトは、日付と時間に関する演算と出力を行います。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2017/10/05 02:45

編集2017/10/05 02:57

お聞きしたいこと

標題の通りではありますが、Python3にて

  • 現在の日付のエポック秒(UTC)
  • 昨日の日付のエポック秒(UTC)

を求めるために奮闘しています。
自分で実装したコードとしては下記になるのですが、現在日付からエポック秒に変換する処理のところでJSTになってしまっているようです(実行環境のサーバーがJSTだから?)

すいませんがどなたかお助けしていただけると嬉しいです。

python3.6

1import boto3 2import datetime 3import time 4import os 5import calendar 6import pytz 7 8# 今日の日付と昨日の日付を取得 9today = datetime.datetime.today() 10yesterday = today - datetime.timedelta(days=1) 11 12# メイン処理 13def main(event, context): 14 print(calendar.timegm(today.astimezone(pytz.utc).timetuple())) # UTCの現在時刻をエポック秒に変換したい 15 print(calendar.timegm(yesterday.astimezone(pytz.utc).timetuple())) # UTCの昨日の時刻をエポック秒に変換したい 16

以上です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

できていると思いますが…?というより、そもそもUNIX時間は 1970-01-01 00:00:00+00:00 からの経過秒数でありタイムゾーンという概念はなく、「UTCなエポック時間」や「JSTなエポック時間」は存在しません。

Python にはタイムゾーン情報を持たない naive オブジェクトと、タイムゾーン情報を持つ aware オブジェクトがあります。特にタイムゾーンを指定しなければ naive オブジェクトになります。

naive オブジェクトにはシステムのローカルタイム(JST)が格納され、今回のように POSIX タイムスタンプに変換する場合にはシステムのタイムゾーン(+09:00)であると解釈して自動変換されるようです。

python

1from datetime import datetime, timezone 2import pytz 3 4 5today_naive = datetime.now() 6today_naive_as_utc = today_naive.replace(tzinfo=timezone.utc) 7today_aware_utc = datetime.now(pytz.utc) 8today_aware_jst = datetime.now(pytz.timezone('Asia/Tokyo')) 9 10print('naive :', today_naive) 11print('naive as UTC:', today_naive_as_utc) 12print('aware/UTC :', today_aware_utc) 13print('aware/JST :', today_aware_jst) 14 15print('-----------------------------------------------') 16print('naive -> TS:', today_naive.timestamp()) 17print('naive as UTC -> TS:', today_naive_as_utc.timestamp()) 18print('aware/UTC -> TS:', today_aware_utc.timestamp()) 19print('aware/JST -> TS:', today_aware_jst.timestamp()) 20 21print('-----------------------------------------------') 22print('naive -> TS -> naive:', datetime.utcfromtimestamp(today_naive.timestamp())) 23print('naive -> TS -> aware:', datetime.fromtimestamp(today_naive.timestamp(), timezone.utc)) 24print('naive as UTC -> TS -> aware:', datetime.fromtimestamp(today_naive_as_utc.timestamp(), timezone.utc))
naive : 2017-10-05 12:55:08.247556 naive as UTC: 2017-10-05 12:55:08.247556+00:00 # ← 誤り aware/UTC : 2017-10-05 03:55:08.247566+00:00 aware/JST : 2017-10-05 12:55:08.285712+09:00 ----------------------------------------------- naive -> TS: 1507175708.247556 naive as UTC -> TS: 1507208108.247556 # ← 誤り aware/UTC -> TS: 1507175708.247566 aware/JST -> TS: 1507175708.285712 ----------------------------------------------- naive -> TS -> naive: 2017-10-05 03:55:08.247556 naive -> TS -> aware: 2017-10-05 03:55:08.247556+00:00 naive as UTC -> TS -> aware: 2017-10-05 12:55:08.247556+00:00 # ← 誤り

上記の naive -> TS -> naive および naive -> TS -> aware を見て下さい。ちゃんと戻っているでしょう?

今回は、datetime.today() で naive オブジェクトを作ったのがJST環境、それを datetime.timestamp() でUNIX時間に変換したのもJST環境だったのでたまたまうまくいっていますが、複数のタイムゾーンや夏時間がある国のタイムゾーンを取り扱う場合は、aware オブジェクトを使うことをおすすめします。


ほかの方の回答を見て追記:

あ。**日付**のエポック秒 というのはその日の 00:00:00 のUNIX時間を取得したいということですか?もしそうなら時間、分、秒、ミリ秒を切り捨てればOKです。

python

1today = datetime( 2 *datetime.today().timetuple()[:3], # 年、月、日のみ抽出 3 tzinfo=pytz.timezone('Asia/Tokyo')) 4print('now :', datetime.now(pytz.timezone('Asia/Tokyo')).timestamp()) 5print('today:', today.timestamp()) 6 7# now : 1507176685.737086 8# today: 1507128060.0

投稿2017/10/05 03:59

編集2017/10/05 10:22
miyahan

総合スコア3095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Qiitaで良い関連情報が紹介されていました。
私も参考にさせていただきました。(投稿者様、ありがとうございます)

Python 3 で少しだけ便利になった datetime の新機能

上記をもとに、UTCの現在日時の年月日部分だけをUNIX時間に変換するサンプルを作りました。エポック秒=UNIX時間と捉えています。サンプルの為、「昨日」は割愛しています。

python

1# python3 2import time 3import calendar 4from datetime import datetime 5 6# UTCで現在日時 7now = datetime.utcnow() 8print(now) 9 10# 現在日時をUNIX時間で 11epoch = calendar.timegm(now.timetuple()) 12print(epoch) 13 14# UTCの年月日だけ取得し、時分秒ミリ秒は0 15today = datetime(now.year, now.month, now.day, 0, 0, 0, 0) 16print(today) 17 18# 加工した日付をUNIX時間で 19epoch = calendar.timegm(today.timetuple()) 20print(epoch)

投稿2017/10/05 03:35

編集2017/10/05 03:37
dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問