2016-02-08 79 views
-1

我没有正确说出这个问题,因此没有任何答案相当符合标准。python中的包含日期范围

我想知道的是,如果只给出日期而不是日期和时间,最好的方式是让time以时代毫秒返回一天的结束?

以下是我正在做的那一刻:

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

该函数的形式DDMMYY日期,然后在23:59:00吐出来的那一天的毫秒为单位。

我想知道,有没有更好的做法呢?

+0

我不知道我明白你想要什么。你可以添加一个你正在寻找的值的例子吗?第二次约会,为什么'00:00'是排他性的? –

+0

如果你正在使用日期,为什么不使用'datetime.date()'对象? –

+0

更确切地说,'day'应该具有什么样的价值,以及你期待从'get_epoch'得到的返回值。 –

回答

1

起初并不十分清楚,但是您想要为给定日期(例如2016-02-14)创建间隔,其中包含当天的第一个和最后一个时刻。这意味着:

第一时刻:2016-02-14 00:00:00.000

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

了以下功能返回的时间间隔为一个三元组。它的工作原理是这样的:

  • 通过与小时,分钟和毫秒都设置为0
  • 当天创建一个新的日期实例创建的间隔start创建的间隔跨越23小时,59分钟, 59999999微秒
  • 这个间隔增加了一天的开始

代码:

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的摘要。

0

发电机

这里是你如何创建一个可生成一个包含范围的函数:

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()的对象。

希望这回答你的问题。