在Python中获取一个月开始和结束的UNIX时间戳

qacovj5a  于 2022-12-24  发布在  Python
关注(0)|答案(3)|浏览(337)

你好StackOverflow Python社区!
我想为一个月的开始和结束生成Unix时间戳,我正在寻找一种方法来在Python中检索任意月份的最后一天(或秒,或分钟...)。
给定连续两个月的datetime.date值,我可以通过从下一个值中减去delta值来得到一个月中的最后一个值,如下所示:

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字典是无序的,所以没有next()方法可以在i上调用!
传统的方法可能是将2月1日的午夜等同于1月31日的最后一秒,但我很好奇如何在Python中检索任意月份的最后一天(或秒,或分钟......)。
我是否需要使用OrderedList,或者是否有一些模块对我的谷歌搜索免疫,我可以使用month.max()属性,而不是动态地解决它?

wd2eg0qa

wd2eg0qa1#

要获取下个月的第一天,一个选项(还有其他选项)可以是:

>>> 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
hl0ma9xz

hl0ma9xz2#

与其试图找到“一个月的最后一秒”,不如直接找到“下个月的第一时刻”(这更容易找到),然后修改do_stuff()函数,只排除第二个参数。
你可以通过以下几种方法来实现这一点:第一,使用<代替<=;第二,从下个月的第一时刻减去任意小的时间增量:

# microseconds is the smallest granularity that python datetime supports
end = datetime.datetime.combine(end_day, start_time) - datetime.timedelta(microseconds=1)

根据你在这里真正想做的事情,我个人正在开发一个名为ranges的模块,它将提供一个连续的Range类(这样你就可以从1月1日(含)到2月1日(不含)),并可能在2019年9月中旬发布。

e4eetjau

e4eetjau3#

因为一年总是有12个月,所以你可以增加月份,避免对一个月的天数做假设,然后使用Python 3.3+中的timestamp来获得Unix时间:

import datetime

def add_month(month: int, year: int) -> tuple[int, int]:
    if month < 12:
        return (month + 1, year)
    return (1, year + 1)

# ...

feb = datetime.date(2019, 2, 1)
end_month, end_year = add_month(feb.month, feb.year)
end_of_month = (datetime.datetime(end_year, end_month, 1, tzinfo=datetime.timezone.utc) - datetime.timedelta(seconds=1)).timestamp() # 1551398399.0
start_of_month = datetime.datetime(feb.year, feb.month, 1, tzinfo=datetime.timezone.utc).timestamp() # 1548979200.0

相关问题