【问题标题】:Python Function that returns date from x days ago返回 x 天前的日期的 Python 函数
【发布时间】:2021-04-27 10:07:17
【问题描述】:

我正在尝试编写一个返回 x 天前日期的函数。如果没有给出日期,则默认为今天的日期。

def get_x_days_ago (x: date: datetime = datetime.today())
    return date_x_days_ago

【问题讨论】:

标签: python function date datetime


【解决方案1】:

您可以使用datetime.datetimedatetime.timedelta

from datetime import datetime, timedelta

def get_x_days_ago(x, date=None):
    if date is None:
        date = datetime.now()
    return date - timedelta(days=x)

print(get_x_days_ago(1)) # 2021-04-26 15:43:53.448687

print(get_x_days_ago(365, datetime(2019, 1, 1))) # 2018-01-01 00:00:00

如果你想assert 使用datetime.datetime 对象的结果。例如,断言“一天前”结果是否与一天前的datetime 相同。

assert get_x_days_ago(1).replace(hour=0, minute=0, second=0, microsecond=0) == datetime(2021, 4, 26)

如果需要,return 语句可以改为

return (date - timedelta(days=x)).replace(hour=0, minute=0, second=0, microsecond=0)

在您的原始问题预编辑中,您键入带注释的 datetime 作为 date 的类型以及返回类型。如果您不关心时间部分,则可以改为传递 datetime.date 对象,而不必处理 datetime.replace 方法。 换句话说,代码变成了

from datetime import date, timedelta

def get_x_days_ago(x, date_given=None):
    if date_given is None:
        date_given = date.today()
    return date_given - timedelta(days=x)

print(get_x_days_ago(1)) # this is of `datetime.date` type
assert get_x_days_ago(1) == date(2021, 4, 26)
print(get_x_days_ago(365, date(2019, 1, 1))) # so is this

【讨论】:

  • 如何对这个功能进行单元测试?因为时间元素总是会改变..... def test_get_x_days_ago(self): self.assertEqual(get_x_days_ago(x=1, date_from=2021-4-22), 2021-4-21) @python_user
  • @Girl007 如果你想用字符串中的日期时间进行断言,你可以在get_x_days_ago 的结果上使用.strftime('%Y-%m-%d'),这样你只会得到yyyy-mm-dd 格式的字符串,类似于self.assertEqual(get_x_days_ago(x=1, date_from=2021-4-22).strftime('%Y-%m-%d'), '2021-04-21') , 如果要更改格式以匹配您的断言规则,请使用%d-%m-%y 而不是%Y-%m-%d 和其他相关格式
猜你喜欢
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多