代码之家  ›  专栏  ›  技术社区  ›  deft_code

如何获取包含默认时区的isoformat日期时间字符串?

  •  46
  • deft_code  · 技术社区  · 15 年前

    我需要生成一个符合ISO格式的时间字符串 yyyy-mm-ddThh:mm:ss.ssssss-ZO:NE . 这个 now() utcnow() 类方法几乎可以满足我的需要。

    >>> import datetime
    >>> #time adjusted for current timezone
    >>> datetime.datetime.now().isoformat()
    '2010-08-03T03:00:00.000000'
    >>> #unadjusted UTC time
    >>> datetime.datetime.utcnow().isoformat()
    '2010-08-03T10:00:00.000000'
    >>>
    >>> #How can I do this?
    >>> datetime.datetime.magic()
    '2010-08-03T10:00:00.000000-07:00'
    
    5 回复  |  直到 9 年前
        1
  •  -5
  •   John Machin Santi    15 年前

    类似下面的例子。注意,我在澳大利亚东部(目前UTC+10小时)。

    >>> import datetime
    >>> dtnow = datetime.datetime.now();dtutcnow = datetime.datetime.utcnow()
    >>> dtnow
    datetime.datetime(2010, 8, 4, 9, 33, 9, 890000)
    >>> dtutcnow
    datetime.datetime(2010, 8, 3, 23, 33, 9, 890000)
    >>> delta = dtnow - dtutcnow
    >>> delta
    datetime.timedelta(0, 36000)
    >>> hh,mm = divmod((delta.days * 24*60*60 + delta.seconds + 30) // 60, 60)
    >>> hh,mm
    (10, 0)
    >>> "%s%+02d:%02d" % (dtnow.isoformat(), hh, mm)
    '2010-08-04T09:33:09.890000+10:00'
    >>>
    
        2
  •  64
  •   Felk    9 年前

    要在python 3.2+中获取当前的UTC时间:

    >>> from datetime import datetime, timezone
    >>> datetime.now(timezone.utc).isoformat()
    '2015-01-27T05:57:31.399861+00:00'
    

    要在python 3.3+中获取本地时间:

    >>> from datetime import datetime, timezone
    >>> datetime.now(timezone.utc).astimezone().isoformat()
    '2015-01-27T06:59:17.125448+01:00'
    

    说明: datetime.now(timezone.utc) 生成时区感知 datetime 以UTC时间表示的对象。 astimezone() 然后更改 日期时间 如果不带参数调用,则返回到系统的区域设置时区。时区感知 日期时间 对象然后自动生成正确的ISO格式。

        3
  •  33
  •   Ofri Raviv    9 年前

    您需要使您的日期时间对象具有时区意识。从 datetime docs :

    有两种日期和时间对象:天真的和有意识的。这种区别是指对象是否具有时区、夏令时或其他类型的算法或政治时间调整的概念。简单的日期时间对象是否代表协调世界时(UTC)、本地时间或其他时区中的时间完全取决于程序,就像它取决于程序一样,特定数字是否代表米、英里或质量。幼稚的datetime对象易于理解和使用,代价是忽略了现实的某些方面。

    当您有一个已知的日期时间对象时,可以使用isoformat()并获得所需的输出。

    要使日期时间对象意识到,您需要 subclass tzinfo, like the second example in here 或者更简单-使用一个为你做的包,比如 pytz python-dateutil

    使用PYTZ,如下所示:

    import datetime, pytz
    datetime.datetime.now(pytz.timezone('US/Central')).isoformat()
    

    如果将strftime与 '%z' format directive 喜欢

    datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
    
        4
  •  17
  •   Wes Turner    10 年前

    arrow :

    >>> import arrow
    >>> arrow.now().isoformat()
    '2015-04-17T06:36:49.463207-05:00'
    >>> arrow.utcnow().isoformat()
    '2015-04-17T11:37:17.042330+00:00'
    
        5
  •  2
  •   Dmitry Shesterkin    9 年前

    在python 2.7+中可以使用 python-dateutil (默认情况下在Mac上显示):

    >>> from datetime import datetime
    >>> from dateutil.tz import tzlocal
    >>> datetime.now(tzlocal()).isoformat()
    '2016-10-22T12:45:45.353489-03:00'
    

    或者,如果要从现有存储字符串转换:

    >>> from datetime import datetime
    >>> from dateutil.tz import tzlocal
    >>> from dateutil.parser import parse
    >>> parse("2016-10-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
    '2016-10-21T16:33:27.696173-03:00' <-- Atlantic Daylight Time (ADT) 
    >>> parse("2016-01-21T16:33:27.696173").replace(tzinfo=tzlocal()).isoformat()
    '2016-01-21T16:33:27.696173-04:00' <-- Atlantic Standard Time (AST)