2013-02-20 25 views
13

私はすべての時間をUTCに保存しています。私のシステムはUTCに設定されています(私はESTにいますが)。現在の日の開始時刻と終了時刻を指定します(UTC→EST→UTC)。 Python

Wed, 20 Feb 2013 03:51:39 +0000 

しかし、私はESTのために今日オフに基づいて情報を選択したいと思いますので、私がしようとしています:私はとして保存された日付が持っている

  • はUTCとして現在の時刻を取得し、 ESTに変更する

    datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York')) 
    2013-02-19 23:17:20.560898-05:00 
    
  • 次は、2013年の開始日(2013年) -02-19 00:00:00.000000-05:00)と終了時刻(2013-02-19 23:59:59.99999-05:00)

  • これらの値を取得したら、 UTCに戻って変換するので、私はそれが私のEST(私のタイムゾーン)が正しいことで締め付けることができる高い値と低い値を持っています。

これは、これを行うための最善の方法ではない、または私は何かが欠けていた場合は(私には非常に複雑に見えるん)私は光を見る助けてください!

TIA

答えあたりのアップデート:

d1 = datetime.utcnow().replace(tzinfo=tz.tzutc()).astimezone(tz.gettz('America/New_York')) 
print d1.strftime("%m %d %Y") ; d2 = d1.replace(day=d1.day + 1) ; print d2.strftime("%m %d %Y") 

私に正しい

02 20 2013 
02 21 2013 

を与えること。私は今それから完全なEST時間を生成し、UTCに変換する必要があります。これは私が把握することはできません。実際には、完了すればUTCのエポックタイムスタンプに変換したいので、データベース操作がかなり簡単になるからです(<、>、==など)。

+0

あなたは今何をしようとしているのか分かりません。この場合、ESTの時間を02/20/2013 00:00 UTCにしたいと思っていました。今すぐすべてのコードは非常に複雑な方法で今日(そして明日)の日付を取得します... –

+0

(ESTで、起動するには、UTCではありません) –

+0

日を置き換えないでください。それは毎月末に壊れます。私の答えに応じて、timedeltaを使用してください。また、すべてを1行でやろうとしないでください。あなたは私の答えの「ほとんど」を使うべきではありません。あなたはそれのように* all *を使うべきです。上のコードは読みにくいです。 最後に、*時間*を使用していませんか?あなたは日付のみを印刷しています。あなたが時間を必要としない場合、これのほとんどは完全に無意味です。日付には、タイムゾーンはありません。 –

答えて

18

現在の時刻をUTCとして取得し、それをESTに変換する最初の手順は、少し意味がないようです。あなたは何のためにその時間を使いますか?

それ以外の場合はむしろむしろわかりにくいようです。 ESTの開始日と終了日をUTCで取得したいので、それらを作成してUTCに変換します。それほど複雑ではありません。 :-)

あなたは今日の開始を低い値として、明日の開始をより高い値として使うことができるように、あなたのマッチングルーチンを見たいかもしれませんので、対処する必要はありませんその23:59:59.9999時間。

更新:

は、あなたの質問の私の元の理解から、これはあなたが何をしたいです:

まず、あなたはそれがUTCであるように23時ESTで(現在の日付を取得したいです12STは、それがその後、UTCで22日であるとして、あなたが、22日にしたい。

>>> from datetime import datetime 
>>> today = datetime.utcnow().date() 
>>> today 
datetime.date(2013, 2, 21) 

第二に、あなたは、検索のためのスタートとして、UTCでその日の00:00:00欲しいです。

>>> from dateutil import tz 
>>> est = tz.gettz('America/New_York') 
>>> start = start.astimezone(est) 
>>> start 
datetime.datetime(2013, 2, 20, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York')) 

そして、あなたはまた、エンドとして明日たい:

>>> from datetime import timedelta 
>>> end = start + timedelta(1) 
>>> end 
datetime.datetime(2013, 2, 21, 19, 0, tzinfo=tzfile('/usr/share/zoneinfo/America/New_York')) 

概要:

today = datetime.utcnow().date() 
start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()).astimezone(est) 
end = start + timedelta(1) 
を使用すると、その時はニューヨークにあるかを知りたいことを除いて

>>> from dateutil import tz 
>>> start = datetime(today.year, today.month, today.day, tzinfo=tz.tzutc()) 
datetime.datetime(2013, 2, 21, 0, 0, tzinfo=tzutc()) 

+0

取得に苦労するこれはうまくいく。私のOPを自分のものに更新しました。 –

+0

@ Mr-sk:更新されました。 –

+0

ありがとうございます - 私はこれのほとんどを使用して終了しました。私はOPの答えを更新します。 –

5

私は間違いなくを与えるでしょうあなたの問題を解決するための外観は、いくつかの手順に従います。

まず文字列を解析する必要があります。優れたDelorean parseメソッドを使用してください。

>>> from delorean import parse 
>>> d = parse("Wed, 20 Feb 2013 03:51:39 +0000") 
>>> d 
Delorean(datetime=2013-02-20 03:51:39+00:00, timezone=UTC) 

あなたはデロリアンオブジェクトに解析された日時を持っていたら、あなたは、単に無意味とはいえEST

>>> d = d.shift('US/Eastern') 
>>> d 
Delorean(datetime=2013-02-19 22:51:39-05:00, timezone=US/Eastern) 

に変換します。あなたはあなたの質問に何も使ってはいけませんが、Deloreanではとても簡単です。

次に、あなたはtruncationステップのためのデロリアンデロリアン輸入

>>> d1 = Delorean(timezone="US/Eastern") 
>>> d1 
Delorean(datetime=2013-02-21 00:35:56.405256-05:00, timezone=US/Eastern) 

からEST

で、今の時間を取得します。

>>> d.truncate('day') 
Delorean(datetime=2013-02-21 00:00:00-05:00, timezone=US/Eastern) 

上記のようにUTCと単純なシフトを行います。

今すぐ終了してください。

d = d.next_day(1) # move to the next day 

次に1秒前にシフトします。図書館が必要とするもの私はこれを更新する予定です。 Deloreanの例からdatetimeを得るには、datetime属性でそれを求めます。

d.datetime - timedelta(seconds=1) 
datetime.datetime(2013, 2, 21, 23, 59, 59, tzinfo=<DstTzInfo 'US/Eastern' EST-1 day, 19:00:00 STD>) 

グッドラックが、このライブラリは、単に日時操作:)を使用して取引が

+0

@ Mr-skこれは助けてください! – myusuf3

+0

1秒前にシフトしますか?それは今日の終わりではない、その日に全部が2番目に欠けている。 1マイクロ秒を引くか、 'if some_datetime

0

はちょうどこのに走った、ここで私が見つけた最も簡単なオプションです必要があります。

from delorean import Delorean 
today_d = Delorean() 
sod_dt = today_d.start_of_day 
eod_dt = today_d.end_of_day 
sod_d = Delorean(sod_dt) 
eod_d = Delorean(eod_dt) 
sod_e = sod_d.epoch 
eod_e = eod_d.epoch 

確認する:

は、
In [69]: eod_e - sod_e 
Out[69]: 86399.99999904633 

ほとんどの人に十分に近い

関連する問題