明確にするために、これはpython 2.6、私はpytzを使用しています。
これは、米国のタイムゾーンのみを扱うアプリケーション用で、日付(今日)を固定し、PSTのみで午後8時と午後11時のUNIXタイムスタンプ(エポック時間)を取得できる必要があります。
これは私を夢中にさせています。
> pacific = pytz.timezone("US/Pacific")
> datetime(2011,2,11,20,0,0,0,pacific)
datetime.datetime(2011, 2, 11, 20, 0, tzinfo=<DstTzInfo 'US/Pacific' PST-1 day, 16:00:0 STD>)
> datetime(2011,2,11,20,0,0,0,pacific).strftime("%s")
'1297454400'
zsh> date -d '@1297454400'
Fri Feb 11 12:00:00 PST 2011
したがって、タイムゾーンを設定し、datetime withをそのタイムゾーンとして作成している場合でも、UTCとして作成し、変換しています。これは、UTCが計算を実行しようとしている1日先になるため、さらに問題になります。
今日午後8時のPSTのタイムスタンプを生成する簡単な(または少なくとも意味のある)方法はありますか?
(明確にするために、データベースタイムスタンプなどのほとんどの状況で、または一般的なストレージでUTCを使用することの価値を理解しています。これはそれらの状況の1つではありません。特にPSTでの夜のタイムスタンプが必要です。UTCは、それに入る。)
UTCタイムゾーンのtzinfoオブジェクトutc
を作成し、次のことを試してください。
_#XXX: WRONG (for any timezone with a non-fixed utc offset), DON'T DO IT
datetime(2011,2,11,20,0,0,0,pacific).astimezone(utc).strftime("%s")
_
編集:コメントで指摘されているように、タイムゾーンをdatetime
コンストラクターに入れると、常に堅牢であるとは限りません。 pytzのドキュメント を使用する推奨される方法は次のとおりです。
_pacific.localize(datetime(2011,2,11,20,0,0,0)).astimezone(utc).strftime("%s")
_
また、コメントから、strftime("%s")
は信頼できないため、タイムゾーン情報(UTCも含む)を無視無視し、実行中のシステムのタイムゾーンを想定します。オン。基盤となるCライブラリの実装に依存しており、一部のシステム(Windowsなど)ではまったく機能しません。
少なくとも2つの問題があります。
"US/Pacific"
_などの固定されていないUTCオフセットを含むタイムゾーンをtzinfoパラメータとして直接渡してはなりません。代わりに se pytz.timezone("US/Pacific").localize()
method を使用する必要があります.strftime('%s')
は移植性がありません tzinfoを無視します 。常にローカルタイムゾーンを使用します。代わりにdatetime.timestamp()
または 以前のPythonバージョン の類似物)==を使用してください。指定されたタイムゾーンでタイムゾーン対応の日時を作成するには:
_#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
tz = pytz.timezone("US/Pacific")
aware = tz.localize(datetime(2011, 2, 11, 20), is_dst=None)
_
POSIXタイムスタンプを取得するには:
_timestamp = (aware - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
_
(Python 2.6、 totimestamp()
メソッドをエミュレートする方法については.total_seconds()
関数を参照 )を参照してください)。