2016-04-02 14 views
0

Ich versuche, die zufällige Zeit zwischen Mitternacht und die aktuelle Zeit in Sekunden zu bekommen.Gelegentliche Zeit zwischen Mitternacht bis zur aktuellen Zeit

Beispiel

12:01 AM -> 10:15 AM von heute, die

python new_visitor.py 
2016-04-02 04:49:54 
──[/Applications/MAMP/htdocs/code/python] 
└── python new_visitor.py 
2016-04-02 09:06:15 
──[/Applications/MAMP/htdocs/code/python] 
└── python new_visitor.py 
2016-04-02 08:59:22 
──[/Applications/MAMP/htdocs/code/python] 
└── python new_visitor.py 
2016-04-02 **12:36:38** 
──[/Applications/MAMP/htdocs/code/python] 
└── python new_visitor.py 
2016-04-02 02:38:54 

Aktuelle Zeit ist 10.22 04/02/2016

def random_date(start, end): 
    delta = end - start 
    int_delta = (delta.days * 24 * 60 * 60) + delta.seconds 
    random_second = randrange(int_delta) 
    return start + timedelta(seconds=random_second) 

start = datetime.datetime.strptime('2016-04-02 12:00:00', '%Y-%m-%d %H:%M:%S') 
end = datetime.datetime.strptime(strftime('%Y-%m-%d %H:%M:%S', gmtime()), '%Y-%m-%d %H:%M:%S') 
print random_date(start, end) 

Ergebnis ist; Ich ging die aktuelle Zeit vorbei.

+0

Könnten Sie den "Import" an der Spitze für einen Neuling wie mich hinzufügen, um zu verstehen, wo die Funktionen herkommen? – shahkalpesh

+0

Wird tun, tut mir leid, dass. – ihue

+0

Mit Blick auf die Ausgabe, wo genau gehen Sie über den Bereich hinaus? Können Sie versuchen, den 12:36 Teil mit am/pm Zeichen zu drucken? – shahkalpesh

Antwort

4

die aktuelle Zeit nehmen, subtrahieren um Mitternacht das aktuelle Datum ein timedelta geben Sie die Anzahl der Sekunden zu erhalten, verwenden Sie random.randrange() ein neues zu erhalten Offset- und dass mit Hilfe von timedelta wieder übersetzen zurück:

from datetime import datetime, time, timedelta 
import random 

now = datetime.now() 
midnight = datetime.combine(now.date(), time.min) 
delta = int((now - midnight).total_seconds()) 
random_dt = midnight + timedelta(seconds=random.randrange(delta)) 

Demo:

>>> from datetime import datetime, time, timedelta 
>>> import random 
>>> now = datetime.now() 
>>> midnight = datetime.combine(now.date(), time.min) 
>>> delta = int((now - midnight).total_seconds()) 
>>> midnight + timedelta(seconds=random.randrange(delta)) 
datetime.datetime(2016, 4, 2, 2, 11, 11) 
>>> midnight + timedelta(seconds=random.randrange(delta)) 
datetime.datetime(2016, 4, 2, 0, 45, 35) 
>>> midnight + timedelta(seconds=random.randrange(delta)) 
datetime.datetime(2016, 4, 2, 5, 56, 58) 
>>> midnight + timedelta(seconds=random.randrange(delta)) 
datetime.datetime(2016, 4, 2, 4, 35, 47) 
>>> midnight + timedelta(seconds=random.randrange(delta)) 
datetime.datetime(2016, 4, 2, 2, 10, 1) 
+0

So nimmst du also die Mitternacht 'Mitternacht = datetime.combine (now.date(), time())'? – ihue

+0

Das ist cool Kumpel :) – ihue

+1

@ihue: Ja, 'time()' ohne Argumente, oder vielleicht 'time.MIN', beide geben Ihnen Mitternacht. –

0

Hier ist eine Modifikation von @Martijn Pieters' answer, zu vermeiden Bias erzeugen oder nicht vorhandenes mal um DST Übergänge:

#!/usr/bin/env python 
from datetime import datetime, timedelta 
from random import randrange 
from tzlocal import get_localzone # $ pip install tzlocal 

local_timezone = get_localzone() 
now = datetime.now(local_timezone) 
today = datetime(now.year, now.month, now.day) 
midnight = local_timezone.normalize(local_timezone.localize(today, is_dst=False)) 
max_seconds = int((now - midnight).total_seconds()) 
random_time = midnight + timedelta(seconds=randrange(max_seconds)) 

is_dst=False wird verwendet, um Mehrdeutigkeiten zu vermeiden, wenn es um Mitternacht einen DST-Übergang gibt.

Verwandte Themen