【问题标题】:'datetime.datetime' object has no attribute 'read''datetime.datetime' 对象没有属性 'read'
【发布时间】:2015-05-17 05:02:11
【问题描述】:

我的应用中的用户具有以下格式的 date_joined 字段:2014-12-14 14:46:43.379518+00:00

为了将此日期时间传递给 Intercom.io,它必须是这样的 UNIX 时间戳:1426020706(这不是同一时间,只是一个示例)。

我已经尝试了几种我在 Stack Overflow 上阅读过的方法(这个问题中的任何方法都没有相同的开始时间格式:Converting datetime.date to UTC timestamp in Python),但没有一种方法奏效。 mktime() 看起来很有希望,但我得到“'datetime.datetime' 对象没有属性 'mktime'。”

我刚试过这个:

import time
import dateutil.parser
import member.models import Member

member = Member.objects.get(email="aspeksnijder@outlook.com")
date_joined = member.date_joined
dt = dateutil.parser.parse(date_joined)
print int(time.mktime(dt.timetuple()))

它返回“'datetime.datetime' 对象没有属性 'read'”。我怎样才能做到这一点?

【问题讨论】:

标签: python datetime


【解决方案1】:

怎么样(使用dateutilpytz 包):

import dateutil.parser
from datetime import datetime
import calendar
import pytz

def str2ts(s):
    ''' Turns a string into a non-naive datetime object, then get the timestamp '''
    # However you get from your string to datetime.datetime object
    dt = dateutil.parser.parse(s)           # String to non-naive datetime
    dt = pytz.utc.normalize(dt)             # Normalize datetime to UTC
    ts = calendar.timegm(dt.timetuple())    # Convert UTC datetime to UTC timestamp
    return int(ts)

def ts2str(ts):
    '''Convert a UTC timestamp into a UTC datetime, then format it to a string'''
    dt = datetime.utcfromtimestamp(ts)      # Convert a UTC timestamp to a naive datetime object
    dt = dt.replace(tzinfo=pytz.utc)        # Convert naive datetime to non-naive
    return dt.strftime('%Y-%m-%d %H:%M:%S.%f%z')

我们可以测试的:

# A list of strings corresponding to the same time, with different timezone offsets
ss = [
    '2014-12-14 14:46:43.379518+00:00',
    '2014-12-14 15:46:43.379518+01:00',
    '2014-12-14 16:46:43.379518+02:00',
    '2014-12-14 17:46:43.379518+03:00',
]    

for s in ss:
    ts = str2ts(s)
    s2 = ts2str(ts)

    print ts, s2

输出:

1418568403 2014-12-14 14:46:43.000000+0000 1418568403 2014-12-14 14:46:43.000000+0000 1418568403 2014-12-14 14:46:43.000000+0000 1418568403 2014-12-14 14:46:43.000000+0000

这些输出所有相同的时间戳和“验证”格式的字符串。

【讨论】:

  • 我试过了,得到了这个:“AttributeError: 'datetime.datetime' object has no attribute 'read'”
  • 看起来“date_joined = str(member.date_joined)”有效。
  • @jedwards 解析函数无法处理时区
  • @heinst dateutil.parser.parse 可以很好地处理时区(请参阅:print(repr(dateutil.parser.parse(<string with timezone>))))——但是,我假设所有字符串都使用 UTC——我将使用更强大的解决方案来更新我的答案.
  • 更新了代码,可以正确处理具有不同时区偏移的字符串。
【解决方案2】:

您似乎有一个知道的日期时间对象。如果你打印它,那么它看起来像:

2014-12-14 14:46:43.379518+00:00

确定print(repr(date_joined))

Converting datetime.date to UTC timestamp in Python 展示了几种获取时间戳的方法,例如,

timestamp = date_joined.timestamp() # in Python 3.3+

或者在较旧的 Python 版本上:

from datetime import datetime

# local time = utc time + utc offset
utc_naive = date_joined.replace(tzinfo=None) - date_joined.utcoffset()
timestamp = (utc_naive - datetime(1970, 1, 1)).total_seconds()

注意:timestamp = calendar.timegm(date_joined.utctimetuple()) 也适用于您的情况,但如果您错误地将代表当地时间的天真日期时间对象传递给它,它可能会默默地返回错误结果。

如果您的输入是时间字符串,则首先是 convert the time string into a datetime object

【讨论】:

    【解决方案3】:

    您可以尝试以下 Python 3 代码:

    import time, datetime
    print(time.mktime(datetime.datetime.strptime("2014-12-14 14:46:43.379518", '%Y-%m-%d %H:%M:%S.%f').replace(tzinfo=datetime.timezone.utc).timetuple()))
    

    哪个打印:

    1418568403.0
    

    【讨论】:

    • downvote:mktime() 是错误的,除非本地时区是 UTC(注意:+00:00 在问题中)
    【解决方案4】:

    我在使用来自 Django 的DateField 的输入时遇到了这个问题,它以XXXX-YY-ZZ 的形式显示:parse(django_datefield) 导致异常。

    解决方法:使用str(django_datefield)

    parse(str(django_datefield))
    

    【讨论】:

    • 投反对票。为什么要将 datetime 对象转换为字符串只是为了解析它?
    【解决方案5】:

    我知道这是一篇旧帖子,但我想强调答案很可能是@Peter 在他的评论中所说的:

    It looks like member.date_joined is already a datetime object, and there's no need to parse it. – Peter Feb 25 '17 at 0:33
    

    所以--您的模型可能已经为您解析为 datetime.datetime 对象。

    【讨论】:

      猜你喜欢
      • 2013-08-23
      • 1970-01-01
      • 1970-01-01
      • 2023-01-05
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-28
      相关资源
      最近更新 更多