【问题标题】:python datetime issue while saving in database保存在数据库中时出现python日期时间问题
【发布时间】:2012-05-03 11:04:11
【问题描述】:

在下面的代码中,我尝试将 2 种日期格式转换为通用日期格式,以便将其存储在我的数据库中。

import datetime
Date1 = '2012-04-24T12:58:52Z'

Date2 = 'Tue, 24 Apr 2012 12:56:21 -0700'

date1 = Date1.replace("T"," ").replace("Z","")
y = datetime.datetime.strptime(date1,"%Y-%m-%d %H:%M:%S")
date1 = datetime.datetime.strftime(y,"%A, %b %d %Y %H:%M:%S %p")

k = Date2.split(" ")
y = " ".join(k[1:len(k)-1])
date2 = datetime.datetime.strptime(y,"%d %b %Y %H:%M:%S")
date2 = datetime.datetime.strftime(date2,"%A, %b %d %Y %H:%M:%S %p")

print date1
print date2

它给了我以下输出。

Tuesday, Apr 24 2012 12:58:52 PM
Tuesday, Apr 24 2012 12:56:21 PM

但是当我尝试将其保存在数据库中时,它会抛出此错误。

Enter a valid date/time in YYYY-MM-DD HH:MM[:ss[.uuuuuu]] format

谁能帮我解决这个问题。 提前致谢。

【问题讨论】:

  • 您是否尝试过调整 strftime 以匹配所需的格式?
  • 嗨@moooeeeep,我试过这样做。但这一次,出现了一个不同的错误。 “时间数据'2012-05-02 19:44:34'与格式'%A, %b %d %Y %H:%M:%S %p'不匹配”
  • 您错过了“T”,请参阅下面的答案以了解正确的格式

标签: python mysql database django datetime


【解决方案1】:

许多数据库接受datetime.datetime 对象。

import datetime

Date1 = '2012-04-24T12:58:52Z'
dt1 = datetime.datetime.strptime(Date1, '%Y-%m-%dT%H:%M:%SZ')
# dt1: datetime.datetime(2012, 4, 24, 12, 58, 52)

现在尝试将 dt1 作为对象插入 DB。

【讨论】:

    【解决方案2】:

    我会将时间存储为纯整数,以自纪元以​​来的秒数(UNIX 时间戳)为单位。这样,您可以轻松地将其存储到任何数据库中。 strftime%s 格式说明符将 UNIX 时间戳作为字符串返回——所以类似于

    int(datetime.datetime.now().strftime('%s'))
    

    应该可以。然后,您可以使用 datetime.datetime.fromtimestamp(…) 将时间戳转换回 datetime 对象。

    【讨论】:

    • 可能他有一个特定的数据库,尽管他没有说明。您会丢失诸如 postgreSQL current_date 之类的功能,并且同样将所有时间转换为自纪元以来的秒数。
    • 没错,用例定义了这种方法是否可行。
    【解决方案3】:

    将此格式用于date1date2

    date1 = datetime.datetime.strftime(y,"%Y-%m-%dT%H:%M:%S")
    date2 = datetime.datetime.strftime(date2,"%Y-%m-%dT%H:%M:%S")
    

    这将导致:

    2012-04-24T12:58:52
    2012-04-24T12:56:21
    

    您报告的错误消息明确指出您需要这种格式。

    【讨论】:

    • 嗨@snies,之前有这个解决方案,但插入数据库时​​弹出以下错误“时间数据'2012-04-24 12:58:52'与格式'%A, %b %d %Y %H:%M:%S %p'"
    • 我有点困惑,也许您编辑了您的问题,但我认为您在原始错误描述中使用“T”分隔日期和时间。请确保您的错误内容以及您的格式字符串是什么样的。细微的差异确实很重要。但最好只发布正在使用的数据库。
    【解决方案4】:

    我不确定您要在数据库中存储哪个对象。正如 eumiro 所建议的,许多库允许您直接存储日期时间对象。但是假设您需要将其存储为字符串,但为什么不能像数据库错误提示的那样格式化 datetime 对象(YYYY-MM-DD HH:MM:ss)?

    所以……像这样:

     import datetime
    
     Date1 = '2012-04-24T12:58:52Z'
     d1 = datetime.datetime.strptime(Date1,"%Y-%m-%dT%H:%M:%SZ")
     d1.strftime("%Y-%m-%d %H:%M:%S") # Store this!
    
     Date2 = 'Tue, 24 Apr 2012 12:56:21 -0700'
     k = Date2.split(" ")
     y = " ".join(k[1:len(k)-1])
     d2 = datetime.datetime.strptime(y,"%d %b %Y %H:%M:%S")
     d2.strftime("%Y-%m-%d %H:%M:%S") # Store this!
    

    这可能超出了您的问题范围,但请注意,使用 Date2,您将删除时区信息 (-0700)。如果这对您很重要,您应该以某种方式解析和存储它。 strptime 中有一个 %z 选项可以解析这个,但不幸的是它似乎不适用于所有平台。

    【讨论】:

    • 我之前也做过同样的事情。它给了我这个错误。 “时间数据'2012-04-24 12:58:52'与格式'%A, %b %d %Y %H:%M:%S %p'不匹配”
    • 看起来你正在使用 Django 和 MySQL。正如 eumiro 建议的那样,您应该能够直接插入 datetime 对象,而无需将其转换为字符串。能否将代码粘贴到设置日期时间属性的位置并保存?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2017-05-17
    • 2016-02-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多