【问题标题】:Why does this datetime date error comes when using strptime为什么使用 strptime 时会出现此 datetime 日期错误
【发布时间】:2019-03-25 05:50:08
【问题描述】:
TypeError: strptime() argument 1 must be str, not datetime.date

运行以下代码时出现上述错误。你对此有什么想法吗?

import datetime
from datetime import datetime, timedelta
import babel
import time


date_format = "%Y-%m-%d"
class HrPayslipEmployees(models.TransientModel):
    _inherit = 'hr.payslip.employees'

@api.one
    def compute_date_diff(self, ds, dt):
        from datetime import datetime
        d1 = datetime.strptime(ds, "%Y-%m-%d")
        d1 = str(d1)
        d2 = datetime.strptime(dt, "%Y-%m-%d")
        d2 = str(d2)
        days = (d2 - d1).days + 1
        if days < 0:
            days = 0
        return days

但相同的代码在 Pythin 2.7 中完美运行,但上面的代码是我在 Python 3.x 上运行的

上面还提到了程序的导入库。

提前致谢。完整的代码就在上面。

【问题讨论】:

  • 你从哪里调用这个方法?此外,错误的行号是多少?
  • from datetime import datetime在方法里面,不相关?
  • 在 Python 3.x 中,您将在方法的第 4 行获得 TypeError: unsupported operand type(s) for -: 'str' and 'str'
  • 你能告诉我为什么你从函数中删除了self 吗?我知道它可以在没有 self 的情况下工作。为什么我使用 no ,因为我正在将此函数调用到代码的其他部分。例如:month_days = self.compute_date_diff(from_date, to_date)[0]

标签: python python-3.x python-2.7 odoo odoo-12


【解决方案1】:
import datetime
from datetime import datetime, timedelta


date_format = "%Y-%m-%d"


def compute_date_diff( ds, dt):
    d1 = datetime.strptime(ds, "%Y-%m-%d")
    d2 = datetime.strptime(dt, "%Y-%m-%d")
    days = (d2 - d1).days + 1
    if days < 0:
        days = 0
    return days
print(compute_date_diff("2019-03-24","2019-03-25"))

这在 python3 中运行良好。您不需要将 d1 和 d2 转换为字符串来查找日期。

【讨论】:

  • 你能告诉我为什么你从函数中删除了self 吗?我知道它可以在没有 self 的情况下工作。为什么我使用 no ,因为我正在将此函数调用到代码的其他部分。例如:month_days = self.compute_date_diff(from_date, to_date)[0]
【解决方案2】:

您不必将date 转换为str

在 Python 3.x 中

from datetime import datetime

def compute_date_diff(ds, dt):
    d1 = datetime.strptime(ds, "%Y-%m-%d")
    d2 = datetime.strptime(dt, "%Y-%m-%d")
    days = (d2 - d1).days + 1
    if days < 0:
        days = 0
    return days

print(compute_date_diff('2019-01-01', '2019-02-01'))

输出

32

【讨论】:

  • 你能告诉我为什么你从函数中删除了self 吗?我知道它可以在没有 self 的情况下工作。为什么我使用 no ,因为我正在将此函数调用到代码的其他部分。例如:month_days = self.compute_date_diff(from_date, to_date)[0]
  • @PabloEscobar 我只是尽可能缩短了重现错误的时间,您仍然可以通过 month_days = compute_date_diff(from_date, to_date) 来做同样的事情
  • 如果我像上面那样做,我会收到这样的错误,NameError: name 'compute_date_diff' is not defined。因为在课堂上只有我在写这个。在问题中编辑。
  • @PabloEscobar 编辑您分配的部分month_days = self.compute_date_diff(from_date, to_date)[0]
  • 编辑了上面有问题的整个代码。你能检查一下吗?
【解决方案3】:

让我在 Odoo 上下文中回答。使用this commit,您的旧代码不再有效。因为在此之前,您将字符串作为 Odoo 中 DateDatetime 字段的值。截至本次提交,您将获得 python datetime.date resp。 datetime.datetime 对象。

所以只需使用这些对象,如果不需要,不要解析成字符串或从字符串中解析出来。

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 2023-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2013-03-07
    • 2021-10-05
    • 2020-04-28
    • 2021-03-29
    相关资源
    最近更新 更多