37

私はすべての時間を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エポックタイムスタンプに変換したいと思うでしょう。

4

10 に答える 10

53

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

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

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

アップデート:

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

まず、現在の日付をUTCで取得する必要があります(つまり、東部標準時の午後11時の12日は、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
>>> 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)
于 2013-02-20T05:26:29.657 に答える
21

使用datetime pytzすると問題が解決します。

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
于 2018-10-16T07:49:47.890 に答える
8

私は間違いなくデロリアンに一見を与えるでしょう、あなたの問題を解決するためにいくつかのステップに従うでしょう。

最初に文字列を解析する必要があります。デロリアン解析法をうまく使用してください。

>>> 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>)

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

于 2013-02-21T05:47:04.107 に答える
7

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

一日の終わりをすばやく正確に見つけるための私の解決策は次のとおりです。

reference_time.replace(hour=0, minute=0, second=0, microsecond=0) + timedelta(days=1,microseconds=-1)
于 2018-07-28T19:45:48.420 に答える
7

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

import datetime
end_of_today = datetime.datetime.combine(datetime.datetime.today(), datetime.time(23, 59, 59, 999999))
于 2019-04-08T09:49:20.977 に答える
2

これに遭遇したばかりです。これが私が見つけた最も簡単なオプションです。

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

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

于 2017-03-30T18:49:31.197 に答える
1

すでにArrowを使用している場合は、これが優れたソリューションです。

import arrow

now = arrow.now('US/Eastern')
start = now.floor('day')
end = now.ceil('day')

# Use the "datetime" property to access the actual datetime
print(start.datetime)
于 2020-09-15T21:48:32.353 に答える
0

不運な浮動小数点の不正確な場合にファントムマイクロ秒を生成する可能性がありますが、1日の始まりを取得するための最も簡単なソリューション:

import datetime as dt
d = dt.datetime.now()
d = d - dt.timedelta(seconds=d.timestamp() % dt.timedelta(days=1).total_seconds())
于 2020-06-30T10:37:33.560 に答える
0

これはどう

import datetime
datetime.datetime.combine(datetime.date.today(), datetime.time(00, 00, 00))
datetime.datetime.combine(datetime.date.today(), datetime.time(23, 59, 59))
于 2020-12-22T02:15:01.647 に答える
0

チェックされた最初の投稿と同様ですが、ハードコードされた代わりにローカルタイムゾーンで昨日ではなく今日のように今日を持ちたい場合は、次のようにします。

today = datetime.utcnow().date()
start = datetime(today.year, today.month, today.day).astimezone()
end = start + timedelta(1)
于 2021-01-06T18:57:41.387 に答える