@@ -101,14 +101,43 @@ fn (mut p DateTimeParser) must_be_valid_three_letter_month() !int {
101
101
return error_invalid_time (0 , 'invalid three letter month, at: ${p.current_pos_datetime} ' )
102
102
}
103
103
104
- fn (mut p DateTimeParser) must_be_valid_week_day (letters int ) ! string {
105
- val := p.next (letters)!
104
+ fn (mut p DateTimeParser) must_be_valid_week_day () ! string {
106
105
for v in long_days {
107
- if v[0 ..letters] == val {
108
- return v
106
+ if p.current_pos_datetime + v.len < p.datetime.len {
107
+ weekday := p.datetime[p.current_pos_datetime..p.current_pos_datetime + v.len]
108
+ if v == weekday {
109
+ p.current_pos_datetime + = v.len
110
+ return weekday
111
+ }
109
112
}
110
113
}
111
- return error_invalid_time (0 , 'invalid month name, at: ${p.current_pos_datetime} ' )
114
+ return error_invalid_time (0 , 'invalid weekday, at: ${p.current_pos_datetime} ' )
115
+ }
116
+
117
+ fn (mut p DateTimeParser) must_be_valid_two_letter_week_day () ! int {
118
+ if p.current_pos_datetime + 2 < p.datetime.len {
119
+ letters := p.datetime[p.current_pos_datetime..p.current_pos_datetime + 2 ]
120
+ for d := 1 ; d < = long_days.len; d++ {
121
+ if days_string[(d - 1 ) * 3 ..d * 3 - 1 ] == letters {
122
+ p.current_pos_datetime + = 2
123
+ return d
124
+ }
125
+ }
126
+ }
127
+ return error_invalid_time (0 , 'invalid two letter weekday, at: ${p.current_pos_datetime} ' )
128
+ }
129
+
130
+ fn (mut p DateTimeParser) must_be_valid_three_letter_week_day () ! int {
131
+ if p.current_pos_datetime + 3 < p.datetime.len {
132
+ letters := p.datetime[p.current_pos_datetime..p.current_pos_datetime + 3 ]
133
+ for d := 1 ; d < = long_days.len; d++ {
134
+ if days_string[(d - 1 ) * 3 ..d * 3 ] == letters {
135
+ p.current_pos_datetime + = 3
136
+ return d
137
+ }
138
+ }
139
+ }
140
+ return error_invalid_time (0 , 'invalid three letter weekday, at: ${p.current_pos_datetime} ' )
112
141
}
113
142
114
143
fn extract_tokens (s string ) ! []string {
@@ -133,9 +162,15 @@ fn extract_tokens(s string) ![]string {
133
162
// YY - 2 digit year, 00..99
134
163
// M - month, 1..12
135
164
// MM - month, 2 digits, 01..12
165
+ // MMM - month, three letters, Jan..Dec
136
166
// MMMM - name of month
137
167
// D - day of the month, 1..31
138
168
// DD - day of the month, 01..31
169
+ // d - day of week, 0..6
170
+ // c - day of week, 1..7
171
+ // dd - day of week, Su..Sa
172
+ // ddd - day of week, Sun..Sat
173
+ // dddd - day of week, Sunday..Saturday
139
174
// H - hour, 0..23
140
175
// HH - hour, 00..23
141
176
// h - hour, 0..23
@@ -206,6 +241,21 @@ fn (mut p DateTimeParser) parse() !Time {
206
241
return error_invalid_time (0 , 'day must be between 01 and 31' )
207
242
}
208
243
}
244
+ 'd' {
245
+ p.must_be_int (1 ) or { return err }
246
+ }
247
+ 'c' {
248
+ p.must_be_int (1 ) or { return err }
249
+ }
250
+ 'dd' {
251
+ p.must_be_valid_two_letter_week_day () or { return err }
252
+ }
253
+ 'ddd' {
254
+ p.must_be_valid_three_letter_week_day () or { return err }
255
+ }
256
+ 'dddd' {
257
+ p.must_be_valid_week_day () or { return err }
258
+ }
209
259
'H' {
210
260
hour_ = p.must_be_int_with_minimum_length (1 , 2 , true ) or {
211
261
return error_invalid_time (0 , 'end of string reached before hours where specified' )
0 commit comments