1
- use crate :: time:: format:: { RFC2822 , SHORT } ;
1
+ use crate :: time:: format:: { DEFAULT , ISO8601 , ISO8601_STRICT , RFC2822 , SHORT } ;
2
+ use crate :: time:: Sign ;
2
3
use crate :: Time ;
4
+ use std:: str:: FromStr ;
3
5
use time:: { Date , OffsetDateTime } ;
4
6
5
7
#[ allow( missing_docs) ]
@@ -13,6 +15,18 @@ pub fn parse(input: &str) -> Option<Time> {
13
15
Some ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
14
16
} else if let Ok ( val) = OffsetDateTime :: parse ( input, RFC2822 ) {
15
17
Some ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
18
+ } else if let Ok ( val) = OffsetDateTime :: parse ( input, ISO8601 ) {
19
+ Some ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
20
+ } else if let Ok ( val) = OffsetDateTime :: parse ( input, ISO8601_STRICT ) {
21
+ Some ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
22
+ } else if let Ok ( val) = OffsetDateTime :: parse ( input, DEFAULT ) {
23
+ Some ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
24
+ } else if let Ok ( val) = u32:: from_str ( input) {
25
+ // Format::Unix
26
+ Some ( Time :: new ( val, 0 ) )
27
+ } else if let Ok ( val) = parse_raw ( input) {
28
+ // Format::Raw
29
+ Some ( val)
16
30
} else if let Some ( val) = relative:: parse ( input) {
17
31
Some ( Time :: new ( val. unix_timestamp ( ) as u32 , val. offset ( ) . whole_seconds ( ) ) )
18
32
} else {
@@ -21,6 +35,25 @@ pub fn parse(input: &str) -> Option<Time> {
21
35
}
22
36
}
23
37
38
+ fn parse_raw ( input : & str ) -> Result < Time , ( ) > {
39
+ let mut split = input. split_whitespace ( ) ;
40
+ let seconds_since_unix_epoch: u32 = split. next ( ) . ok_or ( ( ) ) ?. parse ( ) . map_err ( |_| ( ) ) ?;
41
+ let offset = split. next ( ) . ok_or ( ( ) ) ?;
42
+ if offset. len ( ) != 5 {
43
+ return Err ( ( ) ) ;
44
+ }
45
+ let sign = if & offset[ ..1 ] == "-" { Sign :: Plus } else { Sign :: Minus } ;
46
+ let hours: i32 = offset[ 1 ..3 ] . parse ( ) . map_err ( |_| ( ) ) ?;
47
+ let minutes: i32 = offset[ 3 ..5 ] . parse ( ) . map_err ( |_| ( ) ) ?;
48
+ let offset_in_seconds = hours * 3600 + minutes * 60 ;
49
+ let time = Time {
50
+ seconds_since_unix_epoch,
51
+ offset_in_seconds,
52
+ sign,
53
+ } ;
54
+ Ok ( time)
55
+ }
56
+
24
57
mod relative {
25
58
use std:: str:: FromStr ;
26
59
use time:: { Duration , OffsetDateTime } ;
0 commit comments