Hello StackOverflow Python社区!
我想为一个月的开始和结束生成Unix时间戳。我正在寻找一种方法来检索Python中任意月份的最后一天(或第二秒或分钟...)。
给定连续两个月的datetime.date
值,我可以这样从下一个减去一个增量值来得出一个月中的最后一个值:
import datetime
# dates without time
jan = datetime.date(2019, 1, 1)
feb = datetime.date(2019, 2, 1)
# start/end times
start_time = datetime.time(0, 0, 0, 0, tzinfo=datetime.timezone.utc)
end_time = datetime.time(23, 59, 59, 999, tzinfo=datetime.timezone.utc)
jan_start = datetime.datetime.combine(jan, start_time)
last_day = feb - datetime.timedelta (days = 1)
jan_end = datetime.datetime.combine(last_day, end_time)
do_stuff(jan_start, jan_end)
但是我精通Python的自我却步履蹒跚,试图找到一种方法来插入任意月份并获得相同的结果。我想得到这样的东西:
import datetime
# start/end times
start_time = datetime.time(0, 0, 0, 0, tzinfo=datetime.timezone.utc)
end_time = datetime.time(23, 59, 59, 999, tzinfo=datetime.timezone.utc)
dates = {
"Jan19": datetime.date(2019, 1, 1),
"Feb19": datetime.date(2019, 2, 1),
"Mar19": datetime.date(2019, 3, 1),
"Apr19": datetime.date(2019, 4, 1)
}
for i in dates:
start = datetime.datetime.combine(dates[i], start_time)
end_day = dates[i].next() - datetime.timedelta (days = 1)
end = datetime.datetime.combine(end_day, end_time)
do_stuff(start, end)
只有,哎呀-Python字典是无序的,所以我无法在i
上调用next()方法!
执行此操作的常规方法可能是使用2月1日的午夜,相当于1月31日的最后一秒,但是我很好奇一个人如何可以检索到最后一天(或第二或一分钟)。 。)在Python中任意月份。
我是否需要使用OrderedList,或者是否有一些模块不受我具有Google month.max()
属性的谷歌搜索的干扰,而不是动态地使用它?
答案 0 :(得分:2)
要获得下个月的第一天,一个选项(还有其他)可能是:
>>> import datetime
>>> my_date = datetime.datetime(2019, 4, 5)
>>> my_date
datetime.datetime(2019, 4, 5, 0, 0)
>>> first_day_this_month = datetime.datetime(my_date.year, my_date.month, 1)
>>> first_day_this_month
datetime.datetime(2019, 4, 1, 0, 0)
>>> some_day_next_month = first_day_this_month + datetime.timedelta(days=32)
>>> some_day_next_month
datetime.datetime(2019, 5, 3, 0, 0)
>>> first_day_next_month = datetime.datetime(some_day_next_month.year, some_day_next_month.month, 1)
>>> first_day_next_month
datetime.datetime(2019, 5, 1, 0, 0)
现在要获取当前月份的最后一秒,可以执行以下操作:
>>> last_second_this_month = first_day_next_month - datetime.timedelta(seconds=1)
>>> last_second_this_month
datetime.datetime(2019, 4, 30, 23, 59, 59)
>>> import time
>>> time.mktime(last_second_this_month.timetuple())
1556683199.0
答案 1 :(得分:0)
与其尝试查找“本月的最后一秒”,不如获取“下个月的第一刻”(这更容易找到),然后修改{{1 }}函数可以简单地排除第二个参数。
您可以通过以下两种方式之一进行操作。首先,使用do_stuff()
代替<
。或者第二,只需从下个月的第一刻减去任意小的timedelta:
<=
根据您在这里实际想要做什么,我个人正在开发一个名为# microseconds is the smallest granularity that python datetime supports
end = datetime.datetime.combine(end_day, start_time) - datetime.timedelta(microseconds=1)
的模块,该模块将提供连续的ranges
类(因此您可以从1月1日(含)到2月1日(不含)),可能会在2019年9月中旬发布。完成后,我不知道这是覆盖用例的更简单方法。