できていると思いますが…?というより、そもそも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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。