26

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

そのため、タイムゾーンを設定し、そのタイムゾーンで日時作成していても、UTC として作成してから変換しています。計算をしようとすると UTC が 1 日先になるため、これはより大きな問題です。

今日の午後 8 時 PST のタイムスタンプを生成する簡単な (または少なくとも理にかなった) 方法はありますか?

(明確にするために、データベースのタイムスタンプや一般的なストレージなど、ほとんどの状況で UTC を使用する価値を理解しています。これはそのような状況の 1 つではないため、特に PST の夜のタイムスタンプが必要であり、UTC を使用する必要はありません。入ります。)

4

2 に答える 2

23

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

  1. "US/Pacific"tzinfo パラメータなどの固定されていない UTC オフセットを持つタイムゾーンを直接渡すべきではありません。代わりにメソッドを使用pytz.timezone("US/Pacific").localize()する必要があります
  2. .strftime('%s')移植性がなく、tzinfoを無視し、常にローカル タイムゾーンを使用します。代わりに、古いバージョンの Python でdatetime.timestamp()またはその類似物を使用してください。

指定されたタイムゾーンでタイムゾーン対応の日時を作成するには:

#!/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 では、methodをエミュレートする方法については function を参照totimestamp().total_seconds()してください)。

于 2014-09-04T11:58:16.437 に答える
19

utcUTC タイム ゾーンのtzinfo オブジェクトを作成してから、これを試してください。

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

于 2011-02-11T23:01:20.983 に答える