Python - 從 DST 調整的本地時間到 UTC (Python - From DST-adjusted local time to UTC)


問題描述

Python - 從 DST 調整的本地時間到 UTC (Python - From DST-adjusted local time to UTC)

A specific bank has branches in all major cities in the world. They all open at 10:00 AM local time. If within a timezone that uses DST, then of course the local opening time also follows the DST-adjusted time. So how do I go from the local time to the utc time. 

What I need is a function to_utc(localdt, tz) like this:

Arguments:

  • localdt: localtime, as naive datetime object, DST-adjusted
  • tz: timezone in the TZ-format, e.g. 'Europe/Berlin'

Returns:

  • datetime object, in UTC, timezone-aware

EDIT: 

The biggest challenge is to detect whether the local time is in a period with DST, which also means that it is DST adjusted. 

For 'Europe/Berlin' which has +1 DST in the summer:

  • Jan 1st 10:00 => Jan 1st 9:00 UTC
  • July 1st 10:00 => July 1st 8:00 UTC

For 'Africa/Lagos' which has no DST:

  • Jan 1st 10:00 => Jan 1st 9:00 UTC
  • July 1st 10:00 => July 1st 9:00 UTC

參考解法

方法 1:

Using pytz, and in particular its localize method:

import pytz
import datetime as dt

def to_utc(localdt,tz):
    timezone=pytz.timezone(tz)
    utc=pytz.utc
    return timezone.localize(localdt).astimezone(utc)

if __name__=='__main__':
    for tz in ('Europe/Berlin','Africa/Lagos'):
        for date in (dt.datetime(2011,1,1,10,0,0),
                 dt.datetime(2011,7,1,10,0,0),
                 ):
            print('{tz:15} {l} --> {u}'.format(
                tz=tz,
                l=date.strftime('%b %d %H:%M'),
                u=to_utc(date,tz).strftime('%b %d %H:%M %Z')))

yields

Europe/Berlin   Jan 01 10:00 --> Jan 01 09:00 UTC
Europe/Berlin   Jul 01 10:00 --> Jul 01 08:00 UTC
Africa/Lagos    Jan 01 10:00 --> Jan 01 09:00 UTC
Africa/Lagos    Jul 01 10:00 --> Jul 01 09:00 UTC

方法 2:

from datetime import datetime, tzinfo, timedelta

class GMT1(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=1)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self,dt):
        return "Europe/Prague"
year, month, day = 2011, 7, 23
dt = datetime(year, month, day, 10)

class UTC(tzinfo):
    def utcoffset(self, dt):
        return timedelta(0)
    def dst(self, dt):
        return timedelta(0)
    def tzname(self,dt):
        return "UTC"

def utc(localt, tz):
    return localt.replace(tzinfo=tz).astimezone(UTC())

print utc(dt, GMT1())

New Version. This does what you want -- takes a naive datetime and a timezone and returns a UTC datetime.

(by Erik Ninn-Hansenunutbuagf)

參考文件

  1. Python - From DST-adjusted local time to UTC (CC BY-SA 3.0/4.0)

#utc #Python #pytz #timezone #dst






相關問題

Java - 從外部服務器獲取 POSIX UTC 時間戳的最佳選擇? (Java - Best choice to get a POSIX UTC timestamp from external server?)

PHP - Параўнанне лакальнага і UTC часу са зрушэннем гадзіннага пояса (PHP - Local vs UTC Time Comparison with Timezone Offset)

以 UTC 格式轉換日期時間 (Convert date time in utc)

如何確定日期字符串是否包含已在 Javascript 中添加的時間偏移量? (How to figure out if the Date string contains time offset added already in Javascript?)

Delphi - Tải TTimeZone cho múi giờ không thuộc địa phương và chuyển đổi giữa các múi giờ (Delphi - Get TTimeZone for non-local timezone and convert between timezones)

什麼是“標準”時區縮寫? (What are the "standard" timezone abbreviations?)

如何從包含 Oracle 中時區偏移的日期/時間字符串中獲取 UTC 日期/時間 (How to get UTC date/time from a date/time string that contains timezone offset in Oracle)

如何在不使用 Javascript 的情況下在 ASP.Net 中呈現給定 UTC 日期時間值的本地時間? (How to render local time given UTC datetime values in ASP.Net without using Javascript?)

如何讓 Java 解析和格式化具有相同時區的日期/時間?我一直在獲取本地時區 (How do I get Java to parse and format a date/time with the same time zone? I keep getting the local timezone)

Python - 從 DST 調整的本地時間到 UTC (Python - From DST-adjusted local time to UTC)

7 位小數計算的 UTC 時間 (UTC time with 7 decimals calculation)

我們應用程序中的日期格式 (Date format in our Application)







留言討論