2017-10-20 74 views
0

Je Démarrer et Time.Like Fin indiquées ci-dessousComment puis-je certain temps en Python Range

def overlap(start1, end1, start2, end2): 
    pass 

donc à la fois le moment il y aura une réunion prévue, je veux vous assurer que la réunion est pas chevauchés les uns avec les autres. Donc, si les deux réunions se chevauchent alors il retournera True sinon False.

Je l'ai fait en JavaScript et je veux le faire en Python comme je suis nouveau en Python Je ne suis pas au courant de quel module dois-je utiliser et comment les utiliser. Voici mon implémentation sur JavaScript.

// time of first timespan 
var x = new Date('01/01/2001 8:30:00').getTime(); 
var y = new Date('01/01/2001 9:30:00').getTime(); 

// time of second timespan 
var a = new Date('01/01/2001 8:54:00').getTime(); 
var b = new Date('01/01/2001 9:00:00').getTime(); 

if (Math.min(x, y) <= Math.max(a, b) && Math.max(x, y) >= Math.min(a, b)) { 
    // between 
} 

Répondre

0

C'est le plus proche interprétation de votre code JS que je pouvais faire dans ce court laps de temps:

from datetime import datetime 

#assuming time format comes in a string like this: '8:30:00' 
#assumming provided time has sense, i.e. end1 > start1 and end2 > start2 

TIME_FORMAT = '%H:%M:%S' 

def overlap(start1, end1, start2, end2): 
    #transform time   
    start1_time = datetime.strptime(start1, TIME_FORMAT) 
    end1_time = datetime.strptime(end1, TIME_FORMAT) 
    start2_time = datetime.strptime(start2, TIME_FORMAT) 
    end2_time = datetime.strptime(end2, TIME_FORMAT) 

    #checking conditions 
    if (min(start1_time, end1_time) <= max(start2_time, end2_time)) \ 
    and \ 
    (max(start1_time, end1_time) >= min(start2_time, end2_time)): 
     return True 
    else: 
     return False 

>>>overlap('8:30:00','9:30:00','8:54:00','9:00:00') 
True 

>>>overlap('8:30:00','9:30:00','9:54:00','10:00:00') 
False 

PS: le seul module vous le feriez est datetime comme Python et fournir minmax dans son noyau.

EDIT1: Utiliser uniquement l'heure et non la date.

EDIT1: Mise à jour d'indentation.

+0

Nous pouvons ignorer le champ de date pour l'instant. Allons juste avec le temps. 'chevauchement ('8:30:00', '9:30:00', '9:54:00', '10:00:00')' –

+0

Veuillez vérifier ma dernière mise à jour. :) –

+0

Si vous avez besoin de l'appliquer massivement, 'datetime.strptime' et' dateutil.parser' ne seront pas utiles, vous pouvez utiliser l'approche suivante: https://stackoverflow.com/questions/14163399/convert -list-of-datestrings-to-datetime-très-lent-avec-python-strptime –

0
import datetime 

def overlap(start1, end1, start2, end2): 
    if start1 < start2 and end1 > start2 or \ 
     start1 > start2 and end1 < end2 or \ 
     start1 > start2 and start1 < end2: 
     return True 
    else: 
     return False 

start_date1 = datetime.datetime(2017,1,1) 
end_date1 = datetime.datetime(2017,1,3) 
start_date2 = datetime.datetime(2017,1,2) 
end_date2 = datetime.datetime(2017,1,4) 

print(overlap(start_date1, end_date1, start_date2, end_date2)) 

Vous pouvez également utiliser des temps aussi.

+0

cela fonctionnera pas en cas de chevauchement ' (2,5,1,4) ' –

+0

c'est tellement loin d'être complet. Si date1 commence avant date2 et se termine à n'importe quel moment après que date2 commence, il y a un chevauchement. – asongtoruin

+0

@asongtoruin: Mais c'est exactement le cas ma suggestion va attraper ... – mrCarnivore

1

Que diriez-vous ceci:

from dateutil import parser 

def date_overlap(date1, date2): 
    obj_1 = map(parser.parse, date1) 
    obj_2 = map(parser.parse, date2) 

    # is latest start before earliest end? If so, overlap! 
    if max(obj_1[0], obj_2[0]) < min(obj_1[1], obj_2[1]): 
     return True 
    else: 
     return False 

date_1 = ('01/01/2001 8:30:00', '01/01/2001 9:30:00') 
date_2 = ('01/01/2001 8:54:00', '01/01/2001 9:00:00') 

print date_overlap(date_1, date_2) 

dateutil.parser convertit les chaînes de dates. Si notre dernier départ est avant notre première fin, il y a un chevauchement.

Remarque: si vous utilisez Python 3.x, vous aurez besoin pour envelopper nos deux map sorties sous forme de listes comme ceci:

from dateutil import parser 

def date_overlap(date1, date2): 
    obj_1 = list(map(parser.parse, date1)) 
    obj_2 = list(map(parser.parse, date2)) 

    # is latest start before earliest end? If so, overlap! 
    if max(obj_1[0], obj_2[0]) < min(obj_1[1], obj_2[1]): 
     return True 
    else: 
     return False 

date_1 = ('01/01/2001 8:30:00', '01/01/2001 9:30:00') 
date_2 = ('01/01/2001 8:54:00', '01/01/2001 9:00:00') 

print date_overlap(date_1, date_2) 
+0

Nous pouvons ignorer le champ de date pour le moment. Allons juste avec le temps. 'chevauchement ('8:30:00', '9:30:00', '9:54:00', '10:00:00')' –

+0

@subhambhattacharjee [cela fonctionne toujours] (https: // repl.it/MyCa/1), bien que nous devions convertir en 'list' dans Python 3. – asongtoruin

0
def overlap(start1, end1, start2, end2): 
    return (start1 <= start2 <= end1) or (start2 <= start1 <= end2)