Django Python日期时间设置为午夜。

45

我有一个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' 是只读的


1
你需要一个初始化为00:00:00的日期时间变量吗? - Zain Khan
5个回答

65
使用datetime的“combine”方法与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_date2013-06-05 的结果:

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

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


57

试试这个:

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

73
另一种选择是end_date.replace(hour=0, minute=0, second=0) - Andrew Clark
14
为确保完全清零,您可能需要在F.J的建议中添加microsecond=0。例如,在将datetime.now()的时间部分清零时。 - Adam Hollidge
@F.J 你确定吗?我这样做会出现“'second'是此函数的无效关键字参数”(或'hour',或'minute')的错误。而且它是一个datetime对象而不是一个date对象。也许我做错了什么。 - R Thiede
1
datetime.datetime.replace() 在我使用 secondmicrosecond 关键字参数时运行良好,请确保您拥有一个 datetime.datetime 实例而不是一个 datetime.date - Andrew Clark
2
@AndrewClark:1. 你在第一条评论中忘记了“microsecond”。2. .replace() 可能会为一个已知的日期时间对象返回一个未规范化的值,这可能会在 DST 转换周围引入 ~1 小时的误差。.combine()datetime() 方法都会剥离时区信息,以便您可以添加正确的值,而不是意外使用 .replace() 返回的可能不正确的值。详情请参见:https://dev59.com/uXRC5IYBdhLWcg3wOOP1#11236372 - jfs
@AndrewClark - 这应该是一个个人答案,按照anh所说的添加微秒部分。 - Snigdha Batra

23

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

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

对于午夜,我是否应该使用86400而不是0?这看起来非常有前途。 - Designer023
midnight = datetime.time(23, 59, 59) - Gavin Wahl
1
实际上,您可能想使用datetime.datetime.max(或min)。 - Josh
1
datetime.combine(dt.date(), datetime.min.time()) 对我起作用了。 - polpetti

12

对于带有时区信息的日期,应该是:

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

@LidiyaParshina 这是更好的方式吗? - Antony Hatchkins

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接