@@ -19,63 +19,29 @@ pub(crate) trait TimeExtended {
19
19
/// | `gitoxide default`| `Thu Jan 6 2022 09:32:07 -0500` |
20
20
fn parse_time ( time_str : & str ) -> Result < gix:: date:: Time > {
21
21
let time_str = time_str. trim ( ) ;
22
+ let now = std:: time:: SystemTime :: now ( ) ;
23
+ let zoned_now = jiff:: Zoned :: try_from ( now) . unwrap_or_else ( |_| jiff:: Zoned :: now ( ) ) ;
22
24
23
25
if time_str == "now" {
24
- return Ok ( gix:: date:: Time :: now_local_or_utc ( ) ) ;
26
+ Ok ( gix:: date:: Time :: new (
27
+ zoned_now. timestamp ( ) . as_second ( ) ,
28
+ zoned_now. offset ( ) . seconds ( ) ,
29
+ ) )
30
+ } else if let Ok ( time) = gix:: date:: parse ( time_str, Some ( now) ) {
31
+ Ok ( time)
32
+ } else if let Ok ( time) = gix:: date:: parse (
33
+ & format ! ( "{time_str} {}" , zoned_now. strftime( "%z" ) ) ,
34
+ Some ( now) ,
35
+ ) {
36
+ Ok ( time)
37
+ } else if let Ok ( time) = gix:: date:: parse (
38
+ & format ! ( "{time_str}{}" , zoned_now. strftime( "%:z" ) ) ,
39
+ Some ( now) ,
40
+ ) {
41
+ Ok ( time)
42
+ } else {
43
+ Err ( anyhow ! ( "invalid date `{time_str}`" ) )
25
44
}
26
-
27
- if let Ok ( time) = gix:: date:: parse ( time_str, Some ( std:: time:: SystemTime :: now ( ) ) ) {
28
- return Ok ( time) ;
29
- }
30
-
31
- // Datetime strings without timezone offset
32
- for format_desc in [
33
- // Git default without tz offset
34
- time:: macros:: format_description!(
35
- "[weekday repr:short] [month repr:short] [day padding:none] [hour]:[minute]:[second] [year]"
36
- ) ,
37
-
38
- // RFC-2822 without tz offset
39
- time:: macros:: format_description!(
40
- "[weekday repr:short], [day] [month repr:short] [year] [hour]:[minute]:[second]"
41
- ) ,
42
-
43
- // ISO8601 without tz offset
44
- time:: macros:: format_description!(
45
- "[year]-[month]-[day] [hour]:[minute]:[second] [offset_hour sign:mandatory][offset_minute]"
46
- ) ,
47
-
48
- // Strict ISO8601 without tz offset
49
- time:: macros:: format_description!(
50
- "[year]-[month]-[day]T[hour]:[minute]:[second]"
51
- ) ,
52
-
53
- // Gitoxide default without tz offset
54
- time:: macros:: format_description!(
55
- "[weekday repr:short] [month repr:short] [day] [year] [hour]:[minute]:[second]"
56
- ) ,
57
- ] {
58
- if let Ok ( primitive_dt) = time:: PrimitiveDateTime :: parse ( time_str, format_desc) {
59
- let offset = time:: UtcOffset :: from_whole_seconds (
60
- gix:: date:: Time :: now_local_or_utc ( ) . offset ,
61
- ) ?;
62
- let offset_dt = primitive_dt. assume_offset ( offset) ;
63
- return Ok ( gix:: date:: Time :: new (
64
- offset_dt. unix_timestamp ( ) ,
65
- offset_dt. offset ( ) . whole_seconds ( ) ,
66
- ) ) ;
67
- }
68
- }
69
-
70
- if let Ok ( seconds) = time_str. parse :: < u32 > ( ) {
71
- let offset_dt = time:: OffsetDateTime :: from_unix_timestamp ( seconds. into ( ) ) ?;
72
- return Ok ( gix:: date:: Time :: new (
73
- offset_dt. unix_timestamp ( ) ,
74
- offset_dt. offset ( ) . whole_seconds ( ) ,
75
- ) ) ;
76
- }
77
-
78
- Err ( anyhow ! ( "invalid date `{time_str}`" ) )
79
45
}
80
46
}
81
47
@@ -120,12 +86,9 @@ mod tests {
120
86
fn parse_8601_without_tz ( ) {
121
87
let time_str = "2005-04-07T22:13:09" ;
122
88
let time = Time :: parse_time ( time_str) . unwrap ( ) ;
123
- assert_eq ! (
124
- time. format( gix:: date:: time:: format:: ISO8601_STRICT )
125
- . strip_suffix( "+00:00" )
126
- . unwrap( ) ,
127
- time_str,
128
- ) ;
89
+ assert ! ( time
90
+ . format( gix:: date:: time:: format:: ISO8601_STRICT )
91
+ . starts_with( time_str) ) ;
129
92
}
130
93
131
94
#[ test]
0 commit comments