@@ -13,6 +13,11 @@ lazy_static! {
13
13
static ref TIME_ZONE : Regex = Regex :: new( r"(?P<zone>[\+-]\d{2}(:?\d{2})?)" ) . unwrap( ) ;
14
14
}
15
15
16
+ const SECONDS_MAX : u64 = 10_000_000_000 ;
17
+ const MILLI_PER_SEC : u64 = 1_000 ;
18
+ const NANO_PER_SEC : u64 = 1_000_000_000 ;
19
+ const MILLI_PER_NANO : u64 = 1_000_000 ;
20
+
16
21
#[ derive( Debug , PartialEq ) ]
17
22
pub struct StringTime {
18
23
dates : Vec < CalendarDate > ,
@@ -27,7 +32,7 @@ impl StringTime {
27
32
28
33
pub fn to_utc_date_time ( & self ) -> DateTime < chrono:: Utc > {
29
34
use chrono:: { Utc , Local } ;
30
- use chrono:: naive:: { NaiveDate , NaiveTime } ;
35
+ use chrono:: naive:: NaiveTime ;
31
36
32
37
let date = self . dates . get ( 0 )
33
38
. map ( |x| NaiveDate :: from_ymd ( x. year as i32 , x. month , x. day ) )
@@ -48,7 +53,7 @@ impl StringTime {
48
53
49
54
pub fn make_permutations ( & self ) -> Vec < DateTime < FixedOffset > > {
50
55
use chrono:: { Local , Date } ;
51
- use chrono:: naive:: { NaiveDate , NaiveTime } ;
56
+ use chrono:: naive:: NaiveTime ;
52
57
53
58
let time = self . time . clone ( )
54
59
. map ( |x| NaiveTime :: from_hms_nano ( x. hour , x. min , x. second , x. nano as u32 ) )
@@ -81,9 +86,8 @@ pub enum TimeResult {
81
86
82
87
#[ derive( Debug , PartialEq ) ]
83
88
pub enum EpochTime {
84
- Seconds ( u128 ) ,
85
- Milliseconds ( u128 ) ,
86
- Nanoseconds ( u128 )
89
+ Seconds ( u64 ) ,
90
+ Nanoseconds ( u64 , u64 )
87
91
}
88
92
89
93
impl EpochTime {
@@ -92,8 +96,7 @@ impl EpochTime {
92
96
93
97
let date = match self {
94
98
EpochTime :: Seconds ( s) => NaiveDateTime :: from_timestamp ( * s as i64 , 0 ) ,
95
- EpochTime :: Milliseconds ( s) => NaiveDateTime :: from_timestamp ( * s as i64 / 1000 , ( ( * s % 1000 ) * 1000 ) as u32 ) ,
96
- EpochTime :: Nanoseconds ( s) => NaiveDateTime :: from_timestamp ( * s as i64 / 100_000 , ( * s % 100_000 ) as u32 )
99
+ EpochTime :: Nanoseconds ( sec, nano) => NaiveDateTime :: from_timestamp ( * sec as i64 , * nano as u32 )
97
100
} ;
98
101
99
102
DateTime :: from_utc ( date, Utc )
@@ -135,7 +138,7 @@ pub fn parse(input: &str) -> Result<TimeResult, String> {
135
138
use chrono:: Local ;
136
139
137
140
let mut input = s ! ( input) ;
138
- if let Ok ( value) = input. parse :: < u128 > ( ) {
141
+ if let Ok ( value) = input. parse :: < u64 > ( ) {
139
142
return parse_number ( value) ;
140
143
}
141
144
@@ -279,13 +282,17 @@ impl StringTime {
279
282
}
280
283
}
281
284
282
- fn parse_number ( input : u128 ) -> Result < TimeResult , String > {
283
- return if input < 2u128 . pow ( 31 ) - 1 {
285
+ fn parse_number ( input : u64 ) -> Result < TimeResult , String > {
286
+ return if input < SECONDS_MAX {
284
287
Ok ( TimeResult :: Epoch ( EpochTime :: Seconds ( input) ) )
285
- } else if input < ( 2u128 . pow ( 31 ) - 1 ) * 1000 {
286
- Ok ( TimeResult :: Epoch ( EpochTime :: Milliseconds ( input) ) )
287
- } else if input < ( 2u128 . pow ( 31 ) - 1 ) * 1_000_000 {
288
- Ok ( TimeResult :: Epoch ( EpochTime :: Nanoseconds ( input) ) )
288
+ } else if input < SECONDS_MAX * MILLI_PER_SEC {
289
+ let seconds = input / MILLI_PER_SEC ;
290
+ let millis = input % MILLI_PER_SEC ;
291
+ Ok ( TimeResult :: Epoch ( EpochTime :: Nanoseconds ( seconds, millis * MILLI_PER_NANO ) ) )
292
+ } else if input < SECONDS_MAX * NANO_PER_SEC {
293
+ let seconds = input / NANO_PER_SEC ;
294
+ let nanos = input % NANO_PER_SEC ;
295
+ Ok ( TimeResult :: Epoch ( EpochTime :: Nanoseconds ( seconds, nanos) ) )
289
296
} else {
290
297
Err ( format ! ( "Unknown number {}" , input) )
291
298
}
@@ -348,8 +355,8 @@ fn parse_unwrap(input: &str) -> TimeResult {
348
355
#[ test]
349
356
fn parse_epoch_timestamps_samples ( ) {
350
357
assert_eq ! ( TimeResult :: Epoch ( EpochTime :: Seconds ( 1554248133 ) ) , parse_unwrap( "1554248133" ) ) ;
351
- assert_eq ! ( TimeResult :: Epoch ( EpochTime :: Milliseconds ( 1554248133358 ) ) , parse_unwrap( "1554248133358" ) ) ;
352
- assert_eq ! ( TimeResult :: Epoch ( EpochTime :: Nanoseconds ( 1554248133358000 ) ) , parse_unwrap( "1554248133358000 " ) ) ;
358
+ assert_eq ! ( TimeResult :: Epoch ( EpochTime :: Nanoseconds ( 1554248133 , 358000000 ) ) , parse_unwrap( "1554248133358" ) ) ;
359
+ assert_eq ! ( TimeResult :: Epoch ( EpochTime :: Nanoseconds ( 1555438653 , 801529000 ) ) , parse_unwrap( "1555438653801529000 " ) ) ;
353
360
}
354
361
355
362
#[ test]
0 commit comments