1
- use chrono:: { DateTime , Local , NaiveDate , NaiveDateTime } ;
2
- use jiff:: { Span , Zoned } ;
1
+ use jiff:: { civil:: DateTime , tz:: TimeZone , Span , Timestamp , Zoned } ;
3
2
4
3
use std:: time:: SystemTime ;
5
4
@@ -14,33 +13,28 @@ impl TimeFilter {
14
13
fn from_str ( ref_time : & SystemTime , s : & str ) -> Option < SystemTime > {
15
14
s. parse :: < Span > ( )
16
15
. and_then ( |duration| {
17
- Zoned :: try_from ( * ref_time) . and_then ( |zoned| zoned . checked_sub ( duration) )
16
+ Zoned :: try_from ( * ref_time) . and_then ( |zdt| zdt . checked_sub ( duration) )
18
17
} )
19
- . map ( SystemTime :: from)
20
18
. ok ( )
21
19
. or_else ( || {
22
- DateTime :: parse_from_rfc3339 ( s)
23
- . map ( |dt| dt. into ( ) )
20
+ let local_tz = TimeZone :: system ( ) ;
21
+ s. parse :: < Timestamp > ( )
22
+ . map ( |ts| ts. to_zoned ( TimeZone :: UTC ) )
24
23
. ok ( )
25
24
. or_else ( || {
26
- NaiveDate :: parse_from_str ( s, "%F" )
27
- . ok ( ) ?
28
- . and_hms_opt ( 0 , 0 , 0 ) ?
29
- . and_local_timezone ( Local )
30
- . latest ( )
31
- } )
32
- . or_else ( || {
33
- NaiveDateTime :: parse_from_str ( s, "%F %T" )
34
- . ok ( ) ?
35
- . and_local_timezone ( Local )
36
- . latest ( )
25
+ s. parse :: < DateTime > ( )
26
+ . map ( |dt| local_tz. to_ambiguous_zoned ( dt) )
27
+ . and_then ( |zdt| zdt. later ( ) )
28
+ . ok ( )
37
29
} )
38
30
. or_else ( || {
39
31
let timestamp_secs = s. strip_prefix ( '@' ) ?. parse ( ) . ok ( ) ?;
40
- DateTime :: from_timestamp ( timestamp_secs, 0 ) . map ( Into :: into)
32
+ Timestamp :: from_second ( timestamp_secs)
33
+ . map ( |ts| ts. to_zoned ( TimeZone :: UTC ) )
34
+ . ok ( )
41
35
} )
42
- . map ( |dt| dt. into ( ) )
43
36
} )
37
+ . map ( SystemTime :: from)
44
38
}
45
39
46
40
pub fn before ( ref_time : & SystemTime , s : & str ) -> Option < TimeFilter > {
@@ -66,10 +60,10 @@ mod tests {
66
60
67
61
#[ test]
68
62
fn is_time_filter_applicable ( ) {
69
- let ref_time = NaiveDateTime :: parse_from_str ( "2010-10-10 10:10:10" , "%F %T" )
70
- . unwrap ( )
71
- . and_local_timezone ( Local )
72
- . latest ( )
63
+ let local_tz = TimeZone :: system ( ) ;
64
+ let ref_time = local_tz
65
+ . to_ambiguous_zoned ( "2010-10-10 10:10:10" . parse :: < DateTime > ( ) . unwrap ( ) )
66
+ . later ( )
73
67
. unwrap ( )
74
68
. into ( ) ;
75
69
@@ -125,7 +119,8 @@ mod tests {
125
119
. unwrap( )
126
120
. applies_to( & t1m_ago) ) ;
127
121
128
- let ref_time = DateTime :: parse_from_rfc3339 ( "2010-10-10T10:10:10+00:00" )
122
+ let ref_time = "2010-10-10T10:10:10+00:00"
123
+ . parse :: < Timestamp > ( )
129
124
. unwrap ( )
130
125
. into ( ) ;
131
126
let t1m_ago = ref_time - Duration :: from_secs ( 60 ) ;
@@ -145,7 +140,8 @@ mod tests {
145
140
. applies_to( & t1m_ago) ) ;
146
141
147
142
let ref_timestamp = 1707723412u64 ; // Mon Feb 12 07:36:52 UTC 2024
148
- let ref_time = DateTime :: parse_from_rfc3339 ( "2024-02-12T07:36:52+00:00" )
143
+ let ref_time = "2024-02-12T07:36:52+00:00"
144
+ . parse :: < Timestamp > ( )
149
145
. unwrap ( )
150
146
. into ( ) ;
151
147
let t1m_ago = ref_time - Duration :: from_secs ( 60 ) ;
0 commit comments