2

これは非常に単純なはずですが、Pythonでは完全に理解できません。2つの引数(秒単位のUTC時間と'Europe / Vienna'のようなzoneinfo名)を取り、現地時間からの秒単位のオフセットとその時点のUTCを返す関数が必要です。

Cでは次のようになります。

/* ... code to to set local time to the time zone I want to compare against,
   not shown here. Then call function below to get difference vs localtime.
   Hardly an ideal solution,
   but just to demonstrate what I want in a "lingua franca" (C): */


int get_diff_vs_localtime(const time_t original_utc_time)
{
    struct tm* ts;

    ts = localtime(&original_utc_time);

    return mktime(ts) - original_utc_time;
}

私の質問は、「オルソンのタイムゾーン(例「ヨーロッパ/ストックホルム」)とUTC時刻が与えられた場合、現地時間は何ですか?

4

4 に答える 4

4

「UTC時間(秒)」はPOSIXタイムスタンプを意味すると仮定します。ストックホルム時間に変換するには:

from datetime import datetime
import pytz

tz = pytz.timezone('Europe/Stockholm')

utc_dt = datetime.utcfromtimestamp(posix_timestamp).replace(tzinfo=pytz.utc)
dt = tz.normalize(utc_dt.astimezone(tz))
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

tz.normalize()ソースタイムゾーンがUTCの場合(この場合のように)は不要です。

より簡単な代替方法は、fromtimestamp()tzパラメータを使用して、「エポックからの秒数」を現地時間に変換することです。

from datetime import datetime
import pytz

tz = pytz.timezone('Europe/Stockholm')

dt = datetime.fromtimestamp(posix_timestamp, tz)
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'))

どちらの例でも同じ結果が得られます。

ローカルマシンが「正しい」タイムゾーンを使用し、外部ソースから受信したPOSIXタイムスタンプをUTCに変換する場合、明示的な式を使用できます。

from datetime import datetime, timedelta
import pytz

utc_dt = datetime(1970, 1, 1, tzinfo=pytz.utc) + timedelta(seconds=posix_timestamp)

最新の数式は、より広い日付範囲もサポートする可能性があります(1970年より前、2038年または3000年より後の日付で問題が発生する可能性は低くなります)。

タイムスタンプがローカルの「正しい」ソースからのものである場合は、代わりに最初の2つの例を使用する必要があります(「正しい」と呼びますtime.gmtime())。

于 2012-10-02T15:01:47.760 に答える
3

pytzdatetimeを使用して、次の方法で何かを行うことができます。

from datetime import datetime
from pytz import timezone

def get_diff(now, tzname):
    tz = timezone(tzname)
    utc = timezone('UTC')
    utc.localize(datetime.now())
    delta =  utc.localize(now) - tz.localize(now)
    return delta

次の例ではどれですか...

now = datetime.utcnow()
print(now)
tzname = 'Europe/Stockholm'
delta = get_diff(now, tzname)
print(delta)
now_in_stockholm = now + delta
print(now_in_stockholm)

...出力:

2012-10-02 14:38:56.547475
2:00:00
2012-10-02 16:38:56.547475
于 2012-10-02T14:45:26.100 に答える
3

これはかなり古いですが、私は素晴らしい答えを見つけることができなかったので、これが私が思いついたものです:

from datetime import datetime
local = datetime.now()
utc = datetime.utcnow()
int((local - utc).days * 86400 + round((local - utc).seconds, -1))

戻り値:

-21600

私は(現在)UTCから21600秒(6時間)遅れているからです。

注:計算ごとに時間の差が非常に小さいため、計算された2番目の日付(この場合はUTC)を丸める必要があります。

于 2018-05-16T17:08:06.590 に答える
1

私の質問は、「オルソンのタイムゾーン(例「ヨーロッパ/ストックホルム」)とUTC時刻が与えられた場合、現地時間は何ですか?

私があなたの問題を正しく理解している場合:

from pytz import timezone
import datetime, time

tz = timezone('Asia/Kuwait')
utc_dt = datetime.datetime.utcfromtimestamp(time.time())
utc_dt + tz.utcoffset(utc_dt)

>>> tz.utcoffset(utc_dt).seconds
10800
>>> tz
<DstTzInfo 'Asia/Kuwait' LMT+3:12:00 STD>
>>> utc_dt + tz.utcoffset(utc_dt)
datetime.datetime(2012, 10, 2, 17, 13, 53, 504322)
>>> utc_dt
datetime.datetime(2012, 10, 2, 14, 13, 53, 504322)
于 2012-10-02T14:19:22.027 に答える