包含在python中的日期范围

时间:2016-02-08 10:31:13

标签: python python-2.7 datetime time

我没有正确地说出这个问题,因此,没有一个答案能够达到标准。

我想知道的是,如果只给出日期而不是日期和时间,那么让time在一个纪元毫秒内返回一天结束的最佳方式是什么?< / p>

以下是我现在的表现:

def get_epoch_endofday(day):
    return time.mktime(time.strptime('005923'+day,"%S%M%H%d%m%y"))*1000

该函数采用ddmmyy形式的日期,然后在当天23:59:00吐出纪元毫秒。

我想知道,有更优雅的方式吗?

2 个答案:

答案 0 :(得分:2)

一开始并不是很清楚,但是你想要创建给定日期的间隔(比如2016-02-14),其中包含当天的第一个和最后一个瞬间。这意味着:

第一个瞬间:2016-02-14 00:00:00.000

最后时刻:2016-02-14 23:59:59.999

以下函数将该间隔作为tupel返回。它的工作原理如下:

  • 通过在同一天创建一个新的日期实例来创建间隔的start,其中小时,分钟和毫秒都设置为0
  • 创建一个时间跨度23小时,59分钟,59秒和999999微秒
  • 将此时间间隔添加到当天的开头

代码:

from datetime import datetime, timedelta

# 2016-02-08 11:39:31.093209
day = datetime.now()

def get_day_interval(day):
    start = datetime(day.year, day.month, day.day)
    interval = timedelta(seconds=59, microseconds=999999, minutes=59, hours=23)
    return (start, start + interval)

(start, end) = get_day_interval(day)

# 2016-02-08 00:00:00
print(start)

# 2016-02-08 23:59:59.999999
print(end)

有关更多选项,请参阅Python docs

如果间隔可以是独占的,则代码变得更简单,请参阅this answer的摘要。

答案 1 :(得分:1)

发电机

以下是创建包含范围的函数的方法:

def inc_range(stop, start=0, step=1):
    numerator = start

    while numerator<=stop:
        yield numerator
        numerator += step


a = [val for val in inc_range(10)]
print(a)

显示器:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

现在这种方法可以适应你想要的任何东西;日期或其他。

日期范围生成器

这是根据您的需求量身定制的方法:

from datetime import date, timedelta 


def date_range(stop, start, step=1):
    delta_date = stop - start
    numerator = 0

    while numerator <= delta_date.days:
        yield str(start + timedelta(numerator))
        numerator += step


date_start = date(2014, 3, 15)
date_end = date(2014, 3, 21)

a = [val for val in date_range(date_end, date_start)]
print(a)

显示器:

['2014-03-15', '2014-03-16', '2014-03-17', '2014-03-18', '2014-03-19', '2014-03-20', '2014-03-21']

请注意,如果您在生成器中屈服时不包含str(),则响应将是datetime.date()的对象。

希望这能回答你的问题。