web-dev-qa-db-ja.com

Python-特定のタイムゾーンでの日時の設定(UTC変換なし)

明確にするために、これは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は、それに入る。)

21
liam

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など)ではまったく機能しません。

15
Mark Ransom

少なくとも2つの問題があります。

  1. _"US/Pacific"_などの固定されていないUTCオフセットを含むタイムゾーンをtzinfoパラメータとして直接渡してはなりません。代わりに se pytz.timezone("US/Pacific").localize() method を使用する必要があります
  2. .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()関数を参照 )を参照してください)。

15
jfs