def cast_to_desired_type(self, value): ret = super().cast_to_desired_type(value) if isinstance(ret, datetime): ret = make_tz_aware(ret) return ret
def force_set(self, value: Union[datetime, str]): # - Post process to ensure tz-aware after setting the value # - Checking `None here because `value` could be `None` when allowed # - Type checking performed to make sure that the timezone replacement only applied on `datetime` if value is not None and isinstance(value, datetime): value = make_tz_aware(value) super().force_set(value)
def data_days_collected(collection, filter_, *, hr_range: Optional[int] = None, start: Optional[datetime] = None, end: Optional[datetime] = None): """ Returns the count of days collected in data. Notice that this is different from ``days_collected`` in ``__init__()`` because this one connects to the database to calculate the actual days collected in the filtered dataset while the one in ``__init__()`` will not be checked and assume that it is true. ``hr_range`` will be ignored if both ``start`` and ``end`` is specified. """ trange = TimeRange(range_hr=hr_range, start=start, end=end, end_autofill_now=False) if trange.is_inf: oldest = collection.find_one(filter_, sort=[(OID_KEY, pymongo.ASCENDING)]) if not oldest: return HourlyResult.DAYS_NONE now = now_utc_aware() if start: start = make_tz_aware(start) if start and start > now: return HourlyResult.DAYS_NONE if end: end = make_tz_aware(end) return max( ((end or now) - ObjectId(oldest[OID_KEY]).generation_time).total_seconds() / 86400, 0) else: return trange.hr_length / 24
def test_dt_make_aware(self): self.assertFalse(is_tz_naive(make_tz_aware(datetime.now()))) self.assertFalse(is_tz_naive(make_tz_aware(datetime.utcnow()))) self.assertFalse( is_tz_naive(make_tz_aware(localtime().replace(tzinfo=None)))) self.assertFalse(is_tz_naive(make_tz_aware(now_utc_aware()))) self.assertFalse(is_tz_naive(make_tz_aware(datetime(2020, 5, 7)))) self.assertFalse(is_tz_naive(make_tz_aware(datetime.min))) self.assertFalse( is_tz_naive( make_tz_aware(datetime.min.replace(tzinfo=timezone.utc)))) self.assertFalse(is_tz_naive(make_tz_aware(datetime.max))) self.assertFalse( is_tz_naive( make_tz_aware(datetime.max.replace(tzinfo=timezone.utc))))
def is_after(self, dt: datetime) -> bool: """Check if the target time of the timer is after the given ``dt``.""" return self.target_time >= make_tz_aware(dt)
def get_target_time_diff(self, dt: datetime): return abs(self.target_time - make_tz_aware(dt))