【问题标题】:django python date time set to midnightdjango python 日期时间设置为午夜
【发布时间】:2012-01-11 18:20:13
【问题描述】:

我有我的 django 对象的日期时间,但它可以是一天中的任何时间。可以是一天中的任何时间,但我需要将时间设置为 00:00:00(另一个日期设置为 23:59:59,但原则相同)

end_date = lastItem.pub_date

目前结束日期为 2002-01-11 12:34:56 我需要做什么才能将其更改为 00:00:00?

我试过了:

end_date.hour = '00'

但得到:'datetime.datetime' 对象属性 'time' 是只读的

【问题讨论】:

标签: python django date datetime date-manipulation


【解决方案1】:

对于 tz 感知日期,它应该是:

datetime.combine(dt.date(), datetime.min.time(), dt.tzinfo)

【讨论】:

  • @LidiyaParshina 有更好的方法吗?
【解决方案2】:

将日期时间的“组合”与 time.min 和 time.max 一起使用将给出您的两个日期时间。 例如:

from datetime import date, datetime, time
pub_date = date.today()
min_pub_date_time = datetime.combine(pub_date, time.min) 
max_pub_date_time = datetime.combine(pub_date, time.max)  

pub_date 为 2013 年 6 月 5 日的结果:

min_pub_date_time -> datetime.datetime(2013, 6, 5, 0, 0)

max_pub_date_time -> datetime.datetime(2013, 6, 5, 23, 59, 59, 999999)

【讨论】:

    【解决方案3】:

    datetime 年、月、日、小时等实例属性为read-only,因此您只需创建一个新的datetime 对象并将其分配给end_date

    【讨论】:

      【解决方案4】:

      试试这个:

      import datetime
      pub = lastItem.pub_date
      end_date = datetime.datetime(pub.year, pub.month, pub.day)
      

      【讨论】:

      • 另一种选择是end_date.replace(hour=0, minute=0, second=0)
      • 为了确保它完全归零,您可能需要在 F.J 的建议中添加 microsecond=0。例如,当您将 datetime.now() 的时间部分归零时。
      • @F.J 你确定吗?当我这样做时,我得到“'second' is an invalid keyword argument for this function”(或“小时”或“分钟”)。它是一个日期时间对象而不是日期。也许我做错了什么。
      • @RThiede datetime.datetime.replace() 对我来说可以很好地使用 secondmicrosecond 关键字参数,请确保您有一个 datetime.datetime 实例而不是 datetime.date
      • @AndrewClark:1. 你在第一条评论中忘记了microsecond。 2. .replace() 可能会为感知的日期时间对象返回一个未标准化的值,这可能会在 DST 转换周围引入 ~1h 错误。 .combine()datetime() 方法都会剥离时区信息,以便您可以 add the correct value instead of using by accident a possibly incorrect value returned by .replace()
      【解决方案5】:

      您确定不想使用日期来代替日期时间吗?如果您总是将时间设置为午夜,则应考虑使用日期。如果你真的想使用日期时间,这里有一个函数可以在午夜获得同一天:

      def set_to_midnight(dt):
          midnight = datetime.time(0)
          return datetime.datetime.combine(dt.date(), midnight)
      

      【讨论】:

      • 对于午夜我会使用 86400 而不是 0 吗?这看起来很有希望
      • midnight = datetime.time(23, 59, 59)
      • 其实,你可能想使用 datetime.datetime.max(或 min)。
      • datetime.combine(dt.date(), datetime.min.time()) 为我工作
      猜你喜欢
      • 2021-10-04
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多