Я использую 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
У меня такое чувство, что мое форматирование даты и времени как-то не так, но, честно говоря, я понятия не имею.