Source code for hal.times.dates

# -*- coding: utf-8 -*-

"""Datetime utils """

import datetime
from enum import Enum


[docs]class Weekday(Enum): """Representing weekday by using ints (datetime standard)""" MONDAY = 0 TUESDAY = 1 WEDNESDAY = 2 THURSDAY = 3 FRIDAY = 4 SATURDAY = 5 SUNDAY = 6
[docs] @staticmethod def get_next(weekday, including_today=False): """Gets next day of week :param weekday: day of week :param including_today: If today is sunday and requesting next sunday :return: Date of next monday, tuesday .. """ now = datetime.datetime.now() if now.weekday() == weekday.value and including_today: delta = datetime.timedelta(days=0) elif now.weekday() == weekday.value and not including_today: delta = datetime.timedelta(days=7) else: delta = datetime.timedelta( (7 + weekday.value - now.weekday()) % 7 ) # times delta to next instance return Day(now + delta).get_just_date()
[docs] @staticmethod def get_last(weekday, including_today=False): """Gets last day of week :param weekday: day of week :param including_today: If today is sunday and requesting last sunday :return: Date of last monday, tuesday .. """ now = datetime.datetime.now() if now.weekday() == weekday.value and including_today: delta = datetime.timedelta(days=0) elif now.weekday() == weekday.value and not including_today: delta = - datetime.timedelta(days=7) else: if now.weekday() > weekday.value: delta = - datetime.timedelta( now.weekday() - weekday.value ) # times delta else: delta = - datetime.timedelta( now.weekday() + (7 - weekday.value) ) # times delta return Day(now + delta).get_just_date()
[docs]class Day: def __init__(self, date_time, week_end=Weekday.SUNDAY): """ :param date_time: Date :param week_end: Day when weekend ends """ self.date_time = date_time self.week_end = week_end
[docs] def get_just_date(self): """Parses just date from date-time :return: Just day, month and year (setting hours to 00:00:00) """ return datetime.datetime( self.date_time.year, self.date_time.month, self.date_time.day )
[docs] def is_in_this_week(self): """Checks if date is in this week (from sunday to sunday) :return: True iff date is in this week (from sunday to sunday) """ return self.is_date_in_between( Weekday.get_last(self.week_end, including_today=True), Weekday.get_next(self.week_end), include_end=False )
[docs] def is_date_in_between(self, start, end, include_start=True, include_end=True): """Checks if date is in between dates :param start: Date cannot be before this date :param end: Date cannot be after this date :param include_start: True iff date is start :param include_end: True iff date is end :return: True iff date is in between dates """ start = Day(start).get_just_date() now = self.get_just_date() end = Day(end).get_just_date() if start < now < end: return True if include_start and now == start: return True if include_end and now == end: return True return False
[docs] def get_next_weekday(self, including_today=False): """Gets next week day :param including_today: If today is sunday and requesting next sunday :return: Date of next monday, tuesday .. """ weekday = self.date_time.weekday() return Weekday.get_next(weekday, including_today=including_today)
[docs] def get_last_weekday(self, including_today=False): """Gets last week day :param including_today: If today is sunday and requesting next sunday :return: Date of last monday, tuesday .. """ weekday = self.date_time.weekday() return Weekday.get_last(weekday, including_today=including_today)