33
33
from datetime import datetime, timedelta
34
34
from bitmapist import mark_event, MonthEvents
35
35
36
- now = datetime.utcnow( )
37
- last_month = datetime.utcnow() - timedelta(days=30)
36
+ now = datetime.now(tz=timezone.utc )
37
+ last_month = now - timedelta(days=30)
38
38
39
39
Mark user 123 as active::
40
40
84
84
import calendar
85
85
import threading
86
86
from collections import defaultdict
87
- from datetime import date , datetime , timedelta
87
+ from datetime import date , datetime , timedelta , timezone
88
88
from typing import TYPE_CHECKING , Any , Optional , Union
89
89
90
90
import redis
@@ -159,7 +159,7 @@ def mark_event(
159
159
:param :system The Redis system to use (string, Redis instance, or Pipeline
160
160
instance).
161
161
:param :now Which date should be used as a reference point, default is
162
- `datetime.utcnow( )`
162
+ `datetime.now(tz=timezone.utc )`
163
163
:param :track_hourly Should hourly stats be tracked, defaults to
164
164
bitmapist.TRACK_HOURLY
165
165
:param :track_unique Should unique stats be tracked, defaults to
@@ -200,7 +200,7 @@ def _mark(
200
200
event_name ,
201
201
uuid : int ,
202
202
system = "default" ,
203
- now = None ,
203
+ now : Optional [ datetime ] = None ,
204
204
track_hourly = None ,
205
205
track_unique = None ,
206
206
use_pipeline : bool = True ,
@@ -210,9 +210,8 @@ def _mark(
210
210
track_hourly = TRACK_HOURLY
211
211
if track_unique is None :
212
212
track_unique = TRACK_UNIQUE
213
-
214
- if not now :
215
- now = datetime .utcnow ()
213
+ if now is None :
214
+ now = datetime .now (tz = timezone .utc )
216
215
217
216
obj_classes : list [
218
217
type [MonthEvents ]
@@ -474,12 +473,14 @@ class YearEvents(GenericPeriodEvents):
474
473
"""
475
474
476
475
@classmethod
477
- def from_date (cls , event_name , dt = None , system = "default" ):
478
- dt = dt or datetime .utcnow ()
476
+ def from_date (
477
+ cls , event_name , dt : Optional [date | datetime ] = None , system = "default"
478
+ ):
479
+ dt = dt or datetime .now (tz = timezone .utc )
479
480
return cls (event_name , dt .year , system = system )
480
481
481
482
def __init__ (self , event_name , year = None , system = "default" ):
482
- now = datetime .utcnow ( )
483
+ now = datetime .now ( tz = timezone . utc )
483
484
self .event_name = event_name
484
485
self .year = not_none (year , now .year )
485
486
self .system = system
@@ -492,10 +493,10 @@ def delta(self, value):
492
493
return self .__class__ (self .event_name , self .year + value , self .system )
493
494
494
495
def period_start (self ):
495
- return datetime (self .year , 1 , 1 )
496
+ return datetime (self .year , 1 , 1 , tzinfo = timezone . utc )
496
497
497
498
def period_end (self ):
498
- return datetime (self .year , 12 , 31 , 23 , 59 , 59 , 999999 )
499
+ return datetime (self .year , 12 , 31 , 23 , 59 , 59 , 999999 , tzinfo = timezone . utc )
499
500
500
501
501
502
class MonthEvents (GenericPeriodEvents ):
@@ -508,12 +509,14 @@ class MonthEvents(GenericPeriodEvents):
508
509
"""
509
510
510
511
@classmethod
511
- def from_date (cls , event_name , dt = None , system = "default" ):
512
- dt = dt or datetime .utcnow ()
512
+ def from_date (
513
+ cls , event_name , dt : Optional [date | datetime ] = None , system = "default"
514
+ ):
515
+ dt = dt or datetime .now (tz = timezone .utc )
513
516
return cls (event_name , dt .year , dt .month , system = system )
514
517
515
518
def __init__ (self , event_name , year = None , month = None , system = "default" ):
516
- now = datetime .utcnow ( )
519
+ now = datetime .now ( tz = timezone . utc )
517
520
self .event_name = event_name
518
521
self .year = not_none (year , now .year )
519
522
self .month = not_none (month , now .month )
@@ -525,11 +528,13 @@ def delta(self, value):
525
528
return self .__class__ (self .event_name , year , month , self .system )
526
529
527
530
def period_start (self ):
528
- return datetime (self .year , self .month , 1 )
531
+ return datetime (self .year , self .month , 1 , tzinfo = timezone . utc )
529
532
530
533
def period_end (self ):
531
534
_ , day = calendar .monthrange (self .year , self .month )
532
- return datetime (self .year , self .month , day , 23 , 59 , 59 , 999999 )
535
+ return datetime (
536
+ self .year , self .month , day , 23 , 59 , 59 , 999999 , tzinfo = timezone .utc
537
+ )
533
538
534
539
535
540
class WeekEvents (GenericPeriodEvents ):
@@ -543,14 +548,17 @@ class WeekEvents(GenericPeriodEvents):
543
548
544
549
@classmethod
545
550
def from_date (
546
- cls , event_name : str , dt : Optional [date ] = None , system : str = "default"
551
+ cls ,
552
+ event_name : str ,
553
+ dt : Optional [date | datetime ] = None ,
554
+ system : str = "default" ,
547
555
):
548
- dt = dt or datetime .utcnow ( )
556
+ dt = dt or datetime .now ( tz = timezone . utc )
549
557
dt_year , dt_week , _ = dt .isocalendar ()
550
558
return cls (event_name , dt_year , dt_week , system = system )
551
559
552
560
def __init__ (self , event_name : str , year = None , week = None , system = "default" ):
553
- now = datetime .utcnow ( )
561
+ now = datetime .now ( tz = timezone . utc )
554
562
now_year , now_week , _ = now .isocalendar ()
555
563
self .event_name = event_name
556
564
self .year = not_none (year , now_year )
@@ -565,11 +573,11 @@ def delta(self, value):
565
573
566
574
def period_start (self ):
567
575
s = iso_to_gregorian (self .year , self .week , 1 ) # mon
568
- return datetime (s .year , s .month , s .day )
576
+ return datetime (s .year , s .month , s .day , tzinfo = timezone . utc )
569
577
570
578
def period_end (self ):
571
579
e = iso_to_gregorian (self .year , self .week , 7 ) # mon
572
- return datetime (e .year , e .month , e .day , 23 , 59 , 59 , 999999 )
580
+ return datetime (e .year , e .month , e .day , 23 , 59 , 59 , 999999 , tzinfo = timezone . utc )
573
581
574
582
575
583
class DayEvents (GenericPeriodEvents ):
@@ -582,12 +590,14 @@ class DayEvents(GenericPeriodEvents):
582
590
"""
583
591
584
592
@classmethod
585
- def from_date (cls , event_name : str , dt : Optional [date ] = None , system = "default" ):
586
- dt = dt or datetime .utcnow ()
593
+ def from_date (
594
+ cls , event_name : str , dt : Optional [date | datetime ] = None , system = "default"
595
+ ):
596
+ dt = dt or datetime .now (tz = timezone .utc )
587
597
return cls (event_name , dt .year , dt .month , dt .day , system = system )
588
598
589
599
def __init__ (self , event_name , year = None , month = None , day = None , system = "default" ):
590
- now = datetime .utcnow ( )
600
+ now = datetime .now ( tz = timezone . utc )
591
601
self .event_name = event_name
592
602
self .year = not_none (year , now .year )
593
603
self .month = not_none (month , now .month )
@@ -600,10 +610,12 @@ def delta(self, value):
600
610
return self .__class__ (self .event_name , dt .year , dt .month , dt .day , self .system )
601
611
602
612
def period_start (self ) -> datetime :
603
- return datetime (self .year , self .month , self .day )
613
+ return datetime (self .year , self .month , self .day , tzinfo = timezone . utc )
604
614
605
615
def period_end (self ) -> datetime :
606
- return datetime (self .year , self .month , self .day , 23 , 59 , 59 , 999999 )
616
+ return datetime (
617
+ self .year , self .month , self .day , 23 , 59 , 59 , 999999 , tzinfo = timezone .utc
618
+ )
607
619
608
620
609
621
class HourEvents (GenericPeriodEvents ):
@@ -619,7 +631,7 @@ class HourEvents(GenericPeriodEvents):
619
631
def from_date (
620
632
cls , event_name : str , dt : Optional [datetime ] = None , system = "default"
621
633
):
622
- dt = dt or datetime .utcnow ( )
634
+ dt = dt or datetime .now ( tz = timezone . utc )
623
635
return cls (event_name , dt .year , dt .month , dt .day , dt .hour , system = system )
624
636
625
637
def __init__ (
@@ -631,7 +643,7 @@ def __init__(
631
643
hour : Optional [int ] = None ,
632
644
system : str = "default" ,
633
645
):
634
- now = datetime .utcnow ( )
646
+ now = datetime .now ( tz = timezone . utc )
635
647
self .event_name = event_name
636
648
self .year = not_none (year , now .year )
637
649
self .month = not_none (month , now .month )
@@ -643,18 +655,27 @@ def __init__(
643
655
)
644
656
645
657
def delta (self , value ):
646
- dt = datetime (self . year , self . month , self . day , self . hour ) + timedelta (
647
- hours = value
648
- )
658
+ dt = datetime (
659
+ self . year , self . month , self . day , self . hour , tzinfo = timezone . utc
660
+ ) + timedelta ( hours = value )
649
661
return self .__class__ (
650
662
self .event_name , dt .year , dt .month , dt .day , dt .hour , self .system
651
663
)
652
664
653
665
def period_start (self ) -> datetime :
654
- return datetime (self .year , self .month , self .day , self .hour )
666
+ return datetime (self .year , self .month , self .day , self .hour , tzinfo = timezone . utc )
655
667
656
668
def period_end (self ) -> datetime :
657
- return datetime (self .year , self .month , self .day , self .hour , 59 , 59 , 999999 )
669
+ return datetime (
670
+ self .year ,
671
+ self .month ,
672
+ self .day ,
673
+ self .hour ,
674
+ 59 ,
675
+ 59 ,
676
+ 999999 ,
677
+ tzinfo = timezone .utc ,
678
+ )
658
679
659
680
660
681
# --- Bit operations
0 commit comments