Timedelta расчет определенного диапазона времени работает только с тестовыми событиями - PullRequest
0 голосов
/ 30 августа 2018

Я использую API Календаря Google с Python, чтобы вычислить, сколько часов я работаю в определенные промежутки времени с целью расчета надбавок к зарплате. Мой код работает с моими тестовыми событиями, как требуется, но когда я изменяю свои тестовые события на мои фактические рабочие события, ночные часы становятся неправильными, даже если я не вижу разницы.

Мой код:

from __future__ import print_function
import datetime
from googleapiclient.discovery import build
from httplib2 import Http
from oauth2client import file, client, tools
from math import floor

# If modifying these scopes, delete the file token.json.
SCOPES = 'https://www.googleapis.com/auth/calendar.readonly'

def pause(worked):
    pause = floor(worked.seconds / (3600 * 3))
    payhours = (worked.seconds - (900 * pause)) / 3600
    return payhours

def Sekunder(hours):
    hours = worked.seconds / 3600
    return hours


def main():
    store = file.Storage('token.json')
    creds = store.get()
    if not creds or creds.invalid:
        flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
        creds = tools.run_flow(flow, store)
    service = build('calendar', 'v3', http=creds.authorize(Http()))

    # Call the Calendar API
    start = datetime.datetime(2018, 7, 16).isoformat() + 'Z'
    stop = datetime.datetime(2018, 8, 15).isoformat() + 'Z'
    print(start)
    print(stop)
    print('Getting work events')
    events_result = service.events().list(calendarId='primary', timeMin=start, timeMax=stop , singleEvents=True, orderBy='startTime').execute()
    events = events_result.get('items', [])

    if not events:
        print('No work events found')

    totalHours = 0
    nightHours = 0
    for event in events:
        if event['summary'] == 'Test':
            start = datetime.datetime.strptime(event['start'].get('dateTime'), '%Y-%m-%dT%H:%M:%S%z')
            dateStart = datetime.datetime.date(start)
            timeStart = datetime.datetime.time(start)

            end = datetime.datetime.strptime(event['end'].get('dateTime'), '%Y-%m-%dT%H:%M:%S%z')
            dateEnd = datetime.datetime.date(end)
            timeEnd = datetime.datetime.time(end)

            diff = end - start
            payhours = pause(diff)
            totalHours = totalHours + payhours

            print(start, event['summary'], end, payhours)
            tz = start.tzinfo
            nightTimeStart = datetime.time(18,00,00,tzinfo=tz)
            nightTimeEnd = datetime.time(00,00,00,tzinfo=tz)
            nightStart = datetime.datetime.combine(dateStart, nightTimeStart)
            nightEnd = datetime.datetime.combine(dateStart, nightTimeEnd) + datetime.timedelta(days=1)

            if start >= nightStart and end <= nightEnd:
                nightHours = end - start

            elif start < nightStart and end > nightEnd:
                nightHours = nightEnd - nightStart

            elif start > nightStart and end > nightEnd:
                nightHours = nightEnd - start

            print("Night", nightHours)



    print(totalHours)



if __name__ == '__main__':
    main()

Этот код выводит:

2018-07-16T00:00:00Z
2018-08-15T00:00:00Z
Getting work events
2018-08-07 15:00:00+02:00 Test 2018-08-08 01:00:00+02:00 9.25
Night 6:00:00
2018-08-10 19:00:00+02:00 Test 2018-08-11 01:00:00+02:00 5.5
Night 5:00:00
2018-08-13 17:00:00+02:00 Test 2018-08-13 23:00:00+02:00 5.5
Night 5:00:00
2018-08-14 19:00:00+02:00 Test 2018-08-14 23:00:00+02:00 3.75
Night 4:00:00
24.0

Однако, когда я изменяю эту строку:

if event['summary'] == 'Test':

К этому:

if event['summary'] == 'Arbejde':

Ночные часы оказываются неправильными:

2018-07-16T00:00:00Z
2018-08-15T00:00:00Z
Getting work events
2018-07-17 15:30:00+02:00 Arbejde 2018-07-17 22:00:00+02:00 6.0
Night 0
2018-07-19 15:30:00+02:00 Arbejde 2018-07-19 21:00:00+02:00 5.25
Night 0
2018-07-28 12:00:00+02:00 Arbejde 2018-07-28 22:00:00+02:00 9.25
Night 0
2018-07-29 12:00:00+02:00 Arbejde 2018-07-29 22:00:00+02:00 9.25
Night 0

У меня такое чувство, что мое форматирование даты и времени как-то не так, но, честно говоря, я понятия не имею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...