代码之家  ›  专栏  ›  技术社区  ›  Tom Gruff

如何在Python中将本地时间转换为UTC?

  •  248
  • Tom Gruff  · 技术社区  · 17 年前

    如何转换日期时间 本地时间字符串 以UTC时间表示的字符串

    我肯定我以前做过,但找不到,所以希望将来能帮助我(和其他人)做到这一点。

    澄清 2008-09-17 14:02:00 在我当地的时区( +10 ),我想生成一个具有等效值的字符串 UTC 2008-09-17 04:02:00 .

    还有,从 http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/

    18 回复  |  直到 7 年前
        1
  •  328
  •   MERose    5 年前

    首先,将字符串解析为一个朴素的datetime对象。这是一个例子 datetime.datetime 没有附加的时区信息。看它 documentation

    使用 pytz

    最后,使用 datetime.astimezone() 方法将日期时间转换为UTC。

    源代码,使用本地时区“America/Los_Angeles”,用于字符串“2001-2-3 10:11:12”:

    from datetime import datetime   
    import pytz
    
    local = pytz.timezone("America/Los_Angeles")
    naive = datetime.strptime("2001-2-3 10:11:12", "%Y-%m-%d %H:%M:%S")
    local_dt = local.localize(naive, is_dst=None)
    utc_dt = local_dt.astimezone(pytz.utc)
    

    从那里,您可以使用 strftime() 根据需要格式化UTC日期时间的方法:

    utc_dt.strftime("%Y-%m-%d %H:%M:%S")
    
        2
  •  186
  •   monkut    4 年前

    笔记 --从2020年起,您不应使用 .utcnow() .utcfromtimestamp(xxx)

    >>> from datetime import timezone
    >>> 
    >>> # alternative to '.utcnow()'
    >>> dt_now = datetime.datetime.now(datetime.timezone.utc)
    >>>
    >>> # alternative to '.utcfromtimestamp()'
    >>> dt_ts = datetime.fromtimestamp(1571595618.0, tz=timezone.utc)
    

    详情请参阅: 见: https://blog.ganssle.io/articles/2019/11/utcnow.html

    原始答复(自2010年起):

    datetime模块的 utcnow() 函数可用于获取当前UTC时间。

    >>> import datetime
    >>> utc_datetime = datetime.datetime.utcnow()
    >>> utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
    '2010-02-01 06:59:19'
    

    正如Tom在上面提到的链接: http://lucumr.pocoo.org/2011/7/15/eppur-si-muove/

    UTC是一个没有夏令时的时区,但仍然是一个时区

    始终以UTC为单位测量和存储时间 .

    如果您需要记录时间的位置,请将其单独存储。 不要 存储本地时间+时区信息!

    笔记 -如果您的任何数据位于使用DST的区域中,请使用 pytz

    如果您希望从给定字符串中获取UTC时间,并且您有幸位于世界上不使用DST的地区,或者您的数据仅与UTC偏移,而未应用DST,则:

    --&燃气轮机;使用本地时间作为偏移值的基础:

    >>> # Obtain the UTC Offset for the current system:
    >>> UTC_OFFSET_TIMEDELTA = datetime.datetime.utcnow() - datetime.datetime.now()
    >>> local_datetime = datetime.datetime.strptime("2008-09-17 14:04:00", "%Y-%m-%d %H:%M:%S")
    >>> result_utc_datetime = local_datetime + UTC_OFFSET_TIMEDELTA
    >>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
    '2008-09-17 04:04:00'
    

    --&燃气轮机;或者,使用datetime.timedelta()从已知偏移量:

    >>> UTC_OFFSET = 10
    >>> result_utc_datetime = local_datetime - datetime.timedelta(hours=UTC_OFFSET)
    >>> result_utc_datetime.strftime("%Y-%m-%d %H:%M:%S")
    '2008-09-17 04:04:00'
    

    更新:

    自python 3.2以来 datetime.timezone 有空。您可以使用以下命令生成时区感知的datetime对象:

    import datetime
    
    timezone_aware_dt = datetime.datetime.now(datetime.timezone.utc)
    

    https://medium.com/@eleroy/10-things-you-need-to-know-about-date-and-time-in-python-with-datetime-pytz-dateutil-timedelta-309bfbafb3f7

        3
  •  67
  •   Community Mohan Dere    14 年前

    感谢@rofly,字符串到字符串的完整转换如下:

    time.strftime("%Y-%m-%d %H:%M:%S", 
                  time.gmtime(time.mktime(time.strptime("2008-09-17 14:04:00", 
                                                        "%Y-%m-%d %H:%M:%S"))))
    

    time / calendar 功能:

    time.strptime
    字符串-->元组(未应用时区,因此匹配字符串)

    time.mktime

    time.gmtime
    自纪元以来的秒数-->UTC中的元组

    calendar.timegm
    UTC格式的元组-->年代以来的秒数

    time.localtime

        4
  •  40
  •   akaihola dnlcrl    8 年前

    有些方法以秒为单位,并用 (s) ts = (d - epoch) / unit 可以改为使用(谢谢jfs)。

    • 结构时间(UTC)POSIX :
      calendar.timegm(struct_time)
    • 中堂日期时间(本地)POSIX (s) :
      calendar.timegm(stz.localize(dt, is_dst=None).utctimetuple())
    • NaÃve datetime(UTC)POSIX (s) :
      calendar.timegm(dt.utctimetuple())
    • 感知日期时间–POSIX (s) :
      calendar.timegm(dt.utctimetuple())
    • s ):
      time.gmtime(t)
      (见jfs的评论)
    • 导航日期时间(本地)结构时间(UTC, ):
      stz.localize(dt, is_dst=None).utctimetuple()
      (DST转换期间的异常,请参阅jfs的注释)
    • 导航日期时间(UTC)结构时间(UTC, s ):
      dt.utctimetuple()
    • 感知日期时间结构时间(UTC, ):
      dt.utctimetuple()
    • POSIX中堂日期时间(本地):
      datetime.fromtimestamp(t, None)
      (在某些情况下可能会失败,请参见下面jfs的评论)
    • 结构时间(UTC)导航日期时间(本地、, s ):
      datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
      (不能表示闰秒,请参阅jfs的注释)
    • 中堂日期时间(UTC)中堂日期时间(本地):
      dt.replace(tzinfo=UTC).astimezone(tz).replace(tzinfo=None)
    • 感知日期时间中心日期时间(本地):
      dt.astimezone(tz).replace(tzinfo=None)
    • POSIX导航日期时间(UTC):
      datetime.utcfromtimestamp(t)
    • 结构时间(UTC)导航日期时间(UTC, ):
      datetime.datetime(*struct_time[:6])
      (不能表示闰秒,请参阅jfs的注释)
    • 中堂日期时间(本地)中堂日期时间(UTC):
      stz.localize(dt, is_dst=None).astimezone(UTC).replace(tzinfo=None)
    • 感知日期时间中心日期时间(UTC):
      dt.astimezone(UTC).replace(tzinfo=None)
    • POSIX感知日期时间:
      datetime.fromtimestamp(t, tz)
    • 结构时间(UTC)感知日期时间 :
      datetime.datetime(struct_time[:6], tzinfo=UTC).astimezone(tz)
      (不能表示闰秒,请参阅jfs的注释)
    • 中堂日期时间(本地)感知日期时间:
      stz.localize(dt, is_dst=None)
      (DST转换期间的异常,请参阅jfs的注释)
    • 导航日期时间(UTC)感知日期时间:
      dt.replace(tzinfo=UTC)

    taaviburns.ca

        5
  •  24
  •   Community Mohan Dere    9 年前
    def local_to_utc(t):
        secs = time.mktime(t)
        return time.gmtime(secs)
    
    def utc_to_local(t):
        secs = calendar.timegm(t)
        return time.localtime(secs)
    

    资料来源: http://feihonghsu.blogspot.com/2008/02/converting-from-local-time-to-utc.html

    bd808 datetime.datetime t ,电话:

    local_to_utc(t.timetuple())
    
        6
  •  23
  •   Community Mohan Dere    9 年前

    dateutil (对于其他相关问题,广泛推荐SO):

    from datetime import *
    from dateutil import *
    from dateutil.tz import *
    
    # METHOD 1: Hardcode zones:
    utc_zone = tz.gettz('UTC')
    local_zone = tz.gettz('America/Chicago')
    # METHOD 2: Auto-detect zones:
    utc_zone = tz.tzutc()
    local_zone = tz.tzlocal()
    
    # Convert time string to datetime
    local_time = datetime.strptime("2008-09-17 14:02:00", '%Y-%m-%d %H:%M:%S')
    
    # Tell the datetime object that it's in local time zone since 
    # datetime objects are 'naive' by default
    local_time = local_time.replace(tzinfo=local_zone)
    # Convert time to UTC
    utc_time = local_time.astimezone(utc_zone)
    # Generate UTC time string
    utc_string = utc_time.strftime('%Y-%m-%d %H:%M:%S')
    

    (代码来源于对 Convert UTC datetime string to local datetime )

        7
  •  18
  •   Paulius Sladkevičius    12 年前

    pytz的另一个示例,但包括localize(),这节省了我的时间。

    import pytz, datetime
    utc = pytz.utc
    fmt = '%Y-%m-%d %H:%M:%S'
    amsterdam = pytz.timezone('Europe/Amsterdam')
    
    dt = datetime.datetime.strptime("2012-04-06 10:00:00", fmt)
    am_dt = amsterdam.localize(dt)
    print am_dt.astimezone(utc).strftime(fmt)
    '2012-04-06 08:00:00'
    
        8
  •  12
  •   Paul    10 年前

    python-dateutil :

    from dateutil import tz
    
    def datetime_to_utc(date):
        """Returns date in UTC w/o tzinfo"""
        return date.astimezone(tz.gettz('UTC')).replace(tzinfo=None) if date.tzinfo else date
    
        9
  •  8
  •   Tom Gruff    15 年前
    import time
    
    import datetime
    
    def Local2UTC(LocalTime):
    
        EpochSecond = time.mktime(LocalTime.timetuple())
        utcTime = datetime.datetime.utcfromtimestamp(EpochSecond)
    
        return utcTime
    
    >>> LocalTime = datetime.datetime.now()
    
    >>> UTCTime = Local2UTC(LocalTime)
    
    >>> LocalTime.ctime()
    
    'Thu Feb  3 22:33:46 2011'
    
    >>> UTCTime.ctime()
    
    'Fri Feb  4 05:33:46 2011'
    
        10
  •  8
  •   FObersteiner Peter White    4 年前

    Python 3.6之后提供的一个选项: datetime.astimezone(tz=None) 可用于获取表示本地时间的aware datetime对象 (docs)

    from datetime import datetime, timezone
    s = "2008-09-17 14:02:00"
    
    # to datetime object:
    dt = datetime.fromisoformat(s) # Python 3.7
    
    # I'm on time zone Europe/Berlin; CEST/UTC+2 during summer 2008
    dt = dt.astimezone()
    print(dt)
    # 2008-09-17 14:02:00+02:00
    
    # ...and to UTC:
    dtutc = dt.astimezone(timezone.utc)
    print(dtutc)
    # 2008-09-17 12:02:00+00:00
    

    旁注:虽然所描述的UTC转换工作正常, .astimezone() 设置 tzinfo 将datetime对象转换为timedelta派生的时区-因此不要期望从中获得任何“DST感知”。

        11
  •  6
  •   user235042    16 年前

    dt = datetime.strptime("2008-09-17 14:04:00","%Y-%m-%d %H:%M:%S")
    utc_struct_time = time.gmtime(time.mktime(dt.timetuple()))
    utc_dt = datetime.fromtimestamp(time.mktime(utc_struct_time))
    print dt.strftime("%Y-%m-%d %H:%M:%S")
    
        12
  •  6
  •   Andre Pastore    7 年前

    易于理解的

    >>> utc_delta = datetime.utcnow()-datetime.now()
    >>> utc_time = datetime(2008, 9, 17, 14, 2, 0) + utc_delta
    >>> print(utc_time)
    2008-09-17 19:01:59.999996
    

    奇特的实现

    如果你想变得有趣,你可以把它变成一个函子:

    class to_utc():
        utc_delta = datetime.utcnow() - datetime.now()
    
        def __call__(cls, t):
            return t + cls.utc_delta
    

    结果:

    >>> utc_converter = to_utc()
    >>> print(utc_converter(datetime(2008, 9, 17, 14, 2, 0)))
    2008-09-17 19:01:59.999996
    
        13
  •  4
  •   Tom Gruff    15 年前

    怎么样-

    time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))
    

    如果秒是 None 然后将本地时间转换为UTC时间,否则将传入的时间转换为UTC时间。

        14
  •  4
  •   Cristian Salamea    13 年前

    >>> from time import strftime, gmtime, localtime
    >>> strftime('%H:%M:%S', gmtime()) #UTC time
    >>> strftime('%H:%M:%S', localtime()) # localtime
    
        15
  •  2
  •   Dantalion    14 年前

    为了避开日光节约等。

    以上的答案对我都没有特别的帮助。下面的代码适用于GMT。

    def get_utc_from_local(date_time, local_tz=None):
        assert date_time.__class__.__name__ == 'datetime'
        if local_tz is None:
            local_tz = pytz.timezone(settings.TIME_ZONE) # Django eg, "Europe/London"
        local_time = local_tz.normalize(local_tz.localize(date_time))
        return local_time.astimezone(pytz.utc)
    
    import pytz
    from datetime import datetime
    
    summer_11_am = datetime(2011, 7, 1, 11)
    get_utc_from_local(summer_11_am)
    >>>datetime.datetime(2011, 7, 1, 10, 0, tzinfo=<UTC>)
    
    winter_11_am = datetime(2011, 11, 11, 11)
    get_utc_from_local(winter_11_am)
    >>>datetime.datetime(2011, 11, 11, 11, 0, tzinfo=<UTC>)
    
        16
  •  2
  •   Yash    9 年前

    使用 http://crsmithdev.com/arrow/

    arrowObj = arrow.Arrow.strptime('2017-02-20 10:00:00', '%Y-%m-%d %H:%M:%S' , 'US/Eastern')
    
    arrowObj.to('UTC') or arrowObj.to('local') 
    

        17
  •  2
  •   tobixen    6 年前

    我的一个项目中有此代码:

    from datetime import datetime
    ## datetime.timezone works in newer versions of python
    try:
        from datetime import timezone
        utc_tz = timezone.utc
    except:
        import pytz
        utc_tz = pytz.utc
    
    def _to_utc_date_string(ts):
        # type (Union[date,datetime]]) -> str
        """coerce datetimes to UTC (assume localtime if nothing is given)"""
        if (isinstance(ts, datetime)):
            try:
                ## in python 3.6 and higher, ts.astimezone() will assume a
                ## naive timestamp is localtime (and so do we)
                ts = ts.astimezone(utc_tz)
            except:
                ## in python 2.7 and 3.5, ts.astimezone() will fail on
                ## naive timestamps, but we'd like to assume they are
                ## localtime
                import tzlocal
                ts = tzlocal.get_localzone().localize(ts).astimezone(utc_tz)
        return ts.strftime("%Y%m%dT%H%M%SZ")
    
        18
  •  2
  •   Zisheng Ye    5 年前

    在python 3.9.0中,解析本地时间后 local_time 进入 datetime.datetime 对象,只需使用 local_time.astimezone(datetime.timezone.utc) .

        19
  •  1
  •   franksands    7 年前

    我在另一个问题上找到了最好的答案 here . 它只使用python内置库,不需要您输入本地时区(在我的例子中这是一个要求)

    import time
    import calendar
    
    local_time = time.strptime("2018-12-13T09:32:00.000", "%Y-%m-%dT%H:%M:%S.%f")
    local_seconds = time.mktime(local_time)
    utc_time = time.gmtime(local_seconds)
    

        20
  •  1
  •   Bryce    4 年前

    这里有一个本地人的例子 zoneinfo 模块化 蟒蛇3.9 :

    from datetime import datetime
    from zoneinfo import ZoneInfo
    
    # Get timezone we're trying to convert from
    local_tz = ZoneInfo("America/New_York")
    # UTC timezone
    utc_tz = ZoneInfo("UTC")
    
    dt = datetime.strptime("2021-09-20 17:20:00","%Y-%m-%d %H:%M:%S")
    dt = dt.replace(tzinfo=local_tz)
    dt_utc = dt.astimezone(utc_tz)
    
    print(dt.strftime("%Y-%m-%d %H:%M:%S"))
    print(dt_utc.strftime("%Y-%m-%d %H:%M:%S"))
    

    这可能比仅仅使用更可取 dt.astimezone() 在转换的时区不反映系统本地时区的情况下。不必依赖外部库也很好。

    笔记 :这可能在Windows系统上不起作用,因为 zoneinfo relies on an IANA database 那可能不存在。这个 tzdata 软件包可以作为解决方法安装。它是第一方软件包,但不在标准库中。

        21
  •  0
  •   Philipp    6 年前

    如果您已经有了datetime对象 my_dt 您可以通过以下方式将其更改为UTC:

    datetime.datetime.utcfromtimestamp(my_dt.timestamp())
    
        22
  •  0
  •   Alperen    6 年前

    短暂地 ,以转换任何 datetime 日期至UTC时间:

    from datetime import datetime
    
    def to_utc(date):
        return datetime(*date.utctimetuple()[:6])
    

    让我们用一个例子来解释。首先,我们需要创建一个 从字符串:

    >>> date = datetime.strptime("11 Feb 2011 17:33:54 -0800", "%d %b %Y %H:%M:%S %z")
    

    然后,我们可以调用该函数:

    >>> to_utc(date)
    datetime.datetime(2011, 2, 12, 1, 33, 54)
    

    逐步了解该功能的工作原理:

    >>> date.utctimetuple()
    time.struct_time(tm_year=2011, tm_mon=2, tm_mday=12, tm_hour=1, tm_min=33, tm_sec=54, tm_wday=5, tm_yday=43, tm_isdst=0)
    >>> date.utctimetuple()[:6]
    (2011, 2, 12, 1, 33, 54)
    >>> datetime(*date.utctimetuple()[:6])
    datetime.datetime(2011, 2, 12, 1, 33, 54)
    
        23
  •  0
  •   Lalit Sharma    4 年前

    假设本地日期时间字符串为 2021-09-02T19:02:00Z 等格式

    dt = datetime.strptime(dt,'%Y-%m-%dT%H:%M:%SZ')

    这将为您提供python datetime对象,然后您可以使用 astimezone(pytz.utc) 获取utc日期时间

    dt = datetime.strptime(dt,'%Y-%m-%dT%H:%M:%SZ') dt = dt.astimezone(pytz.utc)

    dt.strftime("%Y-%m-%d %H:%M:%S")

    完整代码例如:

    from datetime import datetime
    import pytz
    
    def converLocalToUTC(datetime, getString=True, format="%Y-%m-%d %H:%M:%S"):
        dt = datetime.strptime(dt,'%Y-%m-%dT%H:%M:%SZ')
        dt = dt.astimezone(pytz.utc)
        
        if getString:
            return dt.strftime(format)
        return dt
    

    那么你可以称之为

    converLocalToUTC("2021-09-02T19:02:00Z")

    https://stackoverflow.com/a/79877/7756843

        24
  •  -1
  •   spedy    8 年前

    在python3中:

    pip install python-dateutil

    from dateutil.parser import tz
    
    mydt.astimezone(tz.gettz('UTC')).replace(tzinfo=None) 
    
        25
  •  -3
  •   Mohammad Efazati    6 年前

    怎么样-

    time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(seconds))
    

    如果秒是 None