2016-02-08 101 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()的對象。

希望這回答你的問題。