2009-12-22 3 views
2

웹 응용 프로그램의 일부에는 매일 드래그 앤 드롭 선택기를 사용하여 '약속'(교대)을 만드는 작업이 포함됩니다. 현재,이 데이터는 다음과 같이 직렬화입니다 :의미있는 데이터로 시간 범위를 직렬화하는 가장 좋은 방법

각 숫자는 일주일의 n 번째 반 시간을 나타냅니다
9,10,11,12,13,14,15,16,76,77,78,298,299,300,301,302,303,304, 

는 (그래서 304은 주 또는 오전 8시 토요일의 300 반 시간입니다). 그때 좀 더 분별있는 무언가로 파이썬으로 서버에이 구문 분석

:

[[9,16],[76,78],[298,304]] 

그러나 나는 문제 때문에 주로하는 방법으로, 깔끔하게 datetime 객체로 변환하는 데 ... 볼품 데이터 처음에 서버에 전송됩니다.

내 질문은 이것이다 : '이동'선택 직렬화 및 자바 스크립트와 파이썬

datetime 객체로 변환 할 수있는 '최선의'방법은 내가 대충 HTML/자바 스크립트의 live version이 무엇 그 나는 생각해 냈다. 클라이언트 쪽에서는 Javascript/jQuery, 서버에서는 Python/Django를 사용하고 있습니다.

답변

1

음, 범위를 추출 할 장소에 코드가 있다고 가정하면 (1,2,3,4가 [1,4]로 변환 됨), 표준 날짜/시간 산술을 사용할 수없는 이유가 표시되지 않습니다. .

from datetime import datetime, timedelta 

def get_shift(start_of_week, start, end): 
    """Returns a 2-tuple of datetimes""" 
    HALF_HOUR = timedelta(minutes=30) 
    return start_of_week + start * HALF_HOUR, start_of_week + (end + 1) * HALF_HOUR 

start_of_week은 월요일 0시해야한다. 이것을 사용하려면 주어진 주에 대해 "월요일 00:00"을 계산하는 방법이 필요합니다.

이 함수는 전달 된 날짜를 포함하는 주중 월요일 00:00을 반환합니다. 예를 들어 start_of_week_containing(datetime.now())으로 시도해보십시오.

def start_of_week_containing(dt): 
    while dt.weekday() > 0: 
     dt = dt - timedelta(days=1) 
    return datetime(dt.year, dt.month, dt.day, 0, 0, 0) 

전체 예 :

start_of_week = start_of_week_containing(datetime.now()) 
shift_start, shift_end = get_shift(start_of_week, 4, 9) 
# now shift_start and shift_end will contain datetime objects 
+0

마지막 줄에서'end'를'(end + 1)'로 변경해야합니다. –

+0

start_of_week이란 무엇입니까? start = 0 == start_of_week입니까? –

+0

수정하여 명확하게 편집했습니다. start_of_week는 특정 주 동안 월요일 00:00입니다. – codeape

2

당신은 간격에 대해 얘기하고.

간격을 갖는 가장 좋은 방법은 시작 시간과 지속 시간입니다.

class Shift(object): 
    def __init__(self, start, length): 
     self.start= start 
     self.length= length 
    def __repr__(self): 
     return "Shift(%d,%d)" % (self.start, self.length) 
    def ends(self): 
     return self.start + self.length 

이러한 개체를 일련 번호로 지정할 수 있습니다.

[ Shift(9,6), Shift(76,2), Shift(298,6) ] 

당신은 나 하나가 다른 포함되어있는 경우 중복 있는지 확인하기 위해 변화를 비교하는 연산자를 구현할 수 있습니다.

왜 길이가 필요합니까? 왜 시간을 끝내지 않습니까?

간격을 특정 시간에 시작하고 주어진 지속 시간 동안 실행하는 것으로 생각하면 겹침 및 포함을 감지하는 수학 중 일부가 매우 간단 해 보입니다. 이런 방식으로 이루어진 교대 사이에 간격이 없다는 것을 증명하는 것이 약간 쉽다는 것을 알았습니다.

"반 개방"간격을 사용하려고합니다. 시작 시간은 교대에 포함되지만 종료 시간은 포함되지 않습니다.

def contains(self, aTime): 
    return self.start <= aTime < self.start + self.length 

def before(self, nextShift): 
    return self.start + self.length == nextShift.start 

def after(self, prevShift): 
    return prevShift.ends() == self.start 

datetime으로 변환하려면 기본 요일이 필요합니다. 그런 다음 교대 시작 시간을 계산하기 위해 수학을 할 수 있습니다. 길이는 (사소한) 간격입니다.

def startDatetime(self, week_start_datetime): 
    offset= datetime.timedelta(seconds= self.start*30*60) 
    return week_start_datetime + offset 

def lengthTimedelta(self): 
    return datetime.timedelta(seconds= self.length*30*60) 

def endDatetime(self, week_start_datetime): 
    return self.startDatetime(week_start_datetime) + self.lengthTimedelta() 
+0

...하지만 여전히 datetime 개체가 없습니다. –

관련 문제