有的時候我們希望生成一段時間返回,比如從 2022-01-01 00:00:00 后面的 10 天,這么 10 個 datetime 對象,但是我們又不想自己去計算哪些月有30天哪些月有31天。
方法一:使用 timedelta
datetime 中包含了 timedelta ,可以用來實現這個功能
from datetime import datetime, timedelta, timezone from pydantic.datetime_parse import parse_datetime from loguru import logger SECOND: int = 1 MINUTE: int = SECOND*60 HOUR: int = MINUTE*60 DAY: int = HOUR*24 WEEK: int = DAY*7 MONTH: int = DAY*30 def get_utc_now_timestamp(with_tzinfo: bool = True) -> datetime: """ https://blog.csdn.net/ball4022/article/details/101670024 """ if not with_tzinfo: return datetime.utcnow() return datetime.utcnow().replace(tzinfo=timezone.utc) def timedelta_seconds(start_time: datetime, end_time: datetime = None) -> int: """ 返回兩個時間相差的秒數 """ if not end_time: end_time = get_utc_now_timestamp() return int((end_time - start_time).total_seconds()) def custom_timestamp(base_timestamp: datetime, seconds: int, reduce=False): return base_timestamp + timedelta(seconds=seconds) \ if not reduce \ else base_timestamp - timedelta(seconds=seconds) start_datetime = parse_datetime('2022-02-27 00:00:00') data = [ dt for dt in [ custom_timestamp(start_datetime, DAY*i) for i in range(10) ] ] logger.debug(data)
輸出如下:
╰─? ?python -u "/Users/ponponon/Desktop/code/me/ideaboom/main.py"
2022-11-15 15:18:37.653 | DEBUG ? ?| __main__:<module>:67 - [datetime.datetime(2022, 2, 27, 0, 0), datetime.datetime(2022, 2, 28, 0, 0), datetime.datetime(2022, 3, 1, 0, 0), datetime.datetime(2022, 3, 2, 0, 0), datetime.datetime(2022, 3, 3, 0, 0), datetime.datetime(2022, 3, 4, 0, 0), datetime.datetime(2022, 3, 5, 0, 0), datetime.datetime(2022, 3, 6, 0, 0), datetime.datetime(2022, 3, 7, 0, 0), datetime.datetime(2022, 3, 8, 0, 0)]
使用 arrow 這個第三方庫
import arrow from loguru import logger from pydantic.datetime_parse import parse_datetime for crawl_date in arrow.Arrow.range('day', parse_datetime('2022-02-27 00:00:00'), parse_datetime('2022-03-10 00:00:00')): logger.debug(crawl_date.datetime)
輸出如下:
╰─? ?python -u "/Users/ponponon/Desktop/code/me/ideaboom/datetime_arrow_range.py"
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-02-27 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-02-28 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-01 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-02 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-03 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-04 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-05 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-06 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-07 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-08 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-09 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG ? ?| __main__:<module>:6 - 2022-03-10 00:00:00+00:00