将JSON日期字符串规范化为UTC python

2024-10-04 09:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个重要的测试,上面写着“计算4月份登录的用户,标准化为UTC时区。”

项目如下所示:

[ {u'email': u' ybartoletti@littel.biz',
  u'login_date': u'2014-05-08T22:30:57-04:00'},
 {u'email': u'woodie.crooks@kozey.com',
  u'login_date': u'2014-04-25T13:27:48-08:00'},
]

在我看来,像2014-04-13T17:12:20-04:00的意思是“2014年4月13日下午5:12:20,比UTC晚4小时”。然后我只使用strptime转换为datetime(Converting JSON date string to python datetime),并减去从获取字符串末尾的regex中获得的小时数的timedelta?我有这种感觉是因为有些人的结尾是+而不是-,比如2014-05-07T00:30:06+07:00

谢谢你


Tags: 项目用户comdatetimedateemailloginutc
3条回答

为此,最好使用^{}^{}包。这将允许您解析字符串并将其转换为具有UTC时区的datetime对象:

>>> s = '2014-05-08T22:30:57-04:00'
>>> import dateutil.parser
>>> import pytz
>>> pytz.UTC.normalize(dateutil.parser.parse(s))
datetime.datetime(2014, 5, 9, 2, 30, 57, tzinfo=<UTC>)

下面的解决方案应该更快,并且避免导入外部库。缺点是,只有当日期字符串都保证具有指定格式时,它才有效。如果不是这样,那么我更喜欢Simeon的解决方案,它让dateutil.parser.parse()处理任何不一致的问题。在

import datetime as dt

def parse_date(datestr):
    diff = dt.timedelta(hours=int(datestr[20:22]), minutes=int(datestr[23:]))
    if datestr[19] == '-':
        return dt.datetime.strptime(datestr[:19], '%Y-%m-%dT%H:%M:%S') - diff
    return dt.datetime.strptime(datestr[:19], '%Y-%m-%dT%H:%M:%S') + diff

您可以使用arrow轻松解析带有时区的日期。在

>>>import arrow
>>> a = arrow.get('2014-05-08T22:30:57-04:00').to('utc')
>>> a
<Arrow [2014-05-09T02:30:57+00:00]>

获取日期时间对象或时间戳:

^{pr2}$

相关问题 更多 >