web-dev-qa-db-ja.com

現在の日の開始時刻と終了時刻(UTC-> EST-> UTC)を決定します。 Python

すべての時間をUTCで保存しており、システムはUTCに設定されています(ただし、ESTにいます)。

私は日付を次のように保存しています:

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
    
  • 次に、ESTの開始時刻(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エポックタイムスタンプに変換することをお勧めします。

19
mr-sk

現在の時刻をUTCとして取得し、それをESTに変換する最初のステップは、少し意味がありません。その時間を何かに使っていますか?

それ以外はかなり簡単に思えます。 UTCでESTの開始と終了を取得したいので、それらを作成してUTCに変換します。それはそれほど複雑ではありません。 :-)

ただし、一致するルーチンを調べて、今日の開始をより低い値として使用し、明日の開始をより高い値として使用できるようにすると、23:59:59.9999の時間を処理する必要がなくなります。 。

更新:

あなたの質問に対する私の最初の理解から、これはあなたがしたいことです:

最初に、UTCで現在の日付を取得します(したがって、UTCでは22日であるため、東部標準時午後11時、22日が必要です)。

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

次に、検索の開始として、UTCでその日の00:00:00が必要です。

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

ニューヨークのその時が何であるかを知りたい場合を除いて:

>>> 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)
30
Lennart Regebro

私は間違いなく Delorean を見て、あなたの問題を解決するにはいくつかのステップを踏むだろう。

最初に文字列を解析する必要があります。 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)

無意味ですが。あなたはあなたの質問の何のためにもそれを決して使用しませんが、デロリアンでは非常に簡単です。

次に、ESTで時間を取得します

デロリアン輸入デロリアンから

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

次に、 切り捨て ステップについて説明します。

>>> 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の例から日付時刻を取得するだけです。

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

幸運を祈りますが、このライブラリは、単に日時操作を処理する必要があります:)

6
myusuf3

use datetimepytzは問題を解決します。

def get_start_and_end():
    tz = pytz.timezone('Asia/Shanghai')
    today = datetime.now(tz=tz)
    start = today.replace(hour=0, minute=0, second=0, microsecond=0)
    end = start + timedelta(1)

    return start, end
5
Lifei Chen

残りは十分にカバーされているため、これは部分的な答えにすぎません。一部のテクノロジーには包括的検索があり、翌日の最初のマイクロ秒からのデータを含めたくないため、これにはしばらく苦労しました。

一日の終わりを迅速かつ正確に見つけるための私のソリューションはこれです:

reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
2
Braden Heckman

質問は古いですが、おそらくこれが役立ちます:

import datetime
end_of_today = datetime.datetime.combine(datetime.datetime.today(), datetime.time(23, 59, 59, 999999))
2
juankysmith

これに遭遇したのは、ここで私が見つけた最も簡単なオプションです:

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

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

1
Bruce Edge