mirror of
https://github.com/vlang/v.git
synced 2025-09-09 23:39:39 -04:00
time: d
,c
,dd
,ddd
,dddd
pattern support for parse_format() (#22003)
This commit is contained in:
parent
6e2ae7c2ed
commit
c0bb9605c0
@ -101,14 +101,43 @@ fn (mut p DateTimeParser) must_be_valid_three_letter_month() !int {
|
|||||||
return error_invalid_time(0, 'invalid three letter month, at: ${p.current_pos_datetime}')
|
return error_invalid_time(0, 'invalid three letter month, at: ${p.current_pos_datetime}')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut p DateTimeParser) must_be_valid_week_day(letters int) !string {
|
fn (mut p DateTimeParser) must_be_valid_week_day() !string {
|
||||||
val := p.next(letters)!
|
|
||||||
for v in long_days {
|
for v in long_days {
|
||||||
if v[0..letters] == val {
|
if p.current_pos_datetime + v.len < p.datetime.len {
|
||||||
return v
|
weekday := p.datetime[p.current_pos_datetime..p.current_pos_datetime + v.len]
|
||||||
|
if v == weekday {
|
||||||
|
p.current_pos_datetime += v.len
|
||||||
|
return weekday
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return error_invalid_time(0, 'invalid month name, at: ${p.current_pos_datetime}')
|
}
|
||||||
|
return error_invalid_time(0, 'invalid weekday, at: ${p.current_pos_datetime}')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut p DateTimeParser) must_be_valid_two_letter_week_day() !int {
|
||||||
|
if p.current_pos_datetime + 2 < p.datetime.len {
|
||||||
|
letters := p.datetime[p.current_pos_datetime..p.current_pos_datetime + 2]
|
||||||
|
for d := 1; d <= long_days.len; d++ {
|
||||||
|
if days_string[(d - 1) * 3..d * 3 - 1] == letters {
|
||||||
|
p.current_pos_datetime += 2
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return error_invalid_time(0, 'invalid two letter weekday, at: ${p.current_pos_datetime}')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn (mut p DateTimeParser) must_be_valid_three_letter_week_day() !int {
|
||||||
|
if p.current_pos_datetime + 3 < p.datetime.len {
|
||||||
|
letters := p.datetime[p.current_pos_datetime..p.current_pos_datetime + 3]
|
||||||
|
for d := 1; d <= long_days.len; d++ {
|
||||||
|
if days_string[(d - 1) * 3..d * 3] == letters {
|
||||||
|
p.current_pos_datetime += 3
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return error_invalid_time(0, 'invalid three letter weekday, at: ${p.current_pos_datetime}')
|
||||||
}
|
}
|
||||||
|
|
||||||
fn extract_tokens(s string) ![]string {
|
fn extract_tokens(s string) ![]string {
|
||||||
@ -133,9 +162,15 @@ fn extract_tokens(s string) ![]string {
|
|||||||
// YY - 2 digit year, 00..99
|
// YY - 2 digit year, 00..99
|
||||||
// M - month, 1..12
|
// M - month, 1..12
|
||||||
// MM - month, 2 digits, 01..12
|
// MM - month, 2 digits, 01..12
|
||||||
|
// MMM - month, three letters, Jan..Dec
|
||||||
// MMMM - name of month
|
// MMMM - name of month
|
||||||
// D - day of the month, 1..31
|
// D - day of the month, 1..31
|
||||||
// DD - day of the month, 01..31
|
// DD - day of the month, 01..31
|
||||||
|
// d - day of week, 0..6
|
||||||
|
// c - day of week, 1..7
|
||||||
|
// dd - day of week, Su..Sa
|
||||||
|
// ddd - day of week, Sun..Sat
|
||||||
|
// dddd - day of week, Sunday..Saturday
|
||||||
// H - hour, 0..23
|
// H - hour, 0..23
|
||||||
// HH - hour, 00..23
|
// HH - hour, 00..23
|
||||||
// h - hour, 0..23
|
// h - hour, 0..23
|
||||||
@ -206,6 +241,21 @@ fn (mut p DateTimeParser) parse() !Time {
|
|||||||
return error_invalid_time(0, 'day must be between 01 and 31')
|
return error_invalid_time(0, 'day must be between 01 and 31')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
'd' {
|
||||||
|
p.must_be_int(1) or { return err }
|
||||||
|
}
|
||||||
|
'c' {
|
||||||
|
p.must_be_int(1) or { return err }
|
||||||
|
}
|
||||||
|
'dd' {
|
||||||
|
p.must_be_valid_two_letter_week_day() or { return err }
|
||||||
|
}
|
||||||
|
'ddd' {
|
||||||
|
p.must_be_valid_three_letter_week_day() or { return err }
|
||||||
|
}
|
||||||
|
'dddd' {
|
||||||
|
p.must_be_valid_week_day() or { return err }
|
||||||
|
}
|
||||||
'H' {
|
'H' {
|
||||||
hour_ = p.must_be_int_with_minimum_length(1, 2, true) or {
|
hour_ = p.must_be_int_with_minimum_length(1, 2, true) or {
|
||||||
return error_invalid_time(0, 'end of string reached before hours where specified')
|
return error_invalid_time(0, 'end of string reached before hours where specified')
|
||||||
|
@ -393,7 +393,7 @@ pub fn (t Time) custom_format(s string) string {
|
|||||||
int(is_leap_year(t.year))))
|
int(is_leap_year(t.year))))
|
||||||
}
|
}
|
||||||
'd' {
|
'd' {
|
||||||
sb.write_string(t.day_of_week().str())
|
sb.write_string('${t.day_of_week() % 7}')
|
||||||
}
|
}
|
||||||
'dd' {
|
'dd' {
|
||||||
sb.write_string(long_days[t.day_of_week() - 1][0..2])
|
sb.write_string(long_days[t.day_of_week() - 1][0..2])
|
||||||
@ -472,7 +472,7 @@ pub fn (t Time) custom_format(s string) string {
|
|||||||
sb.write_string(ordinal_suffix((t.month % 4) + 1))
|
sb.write_string(ordinal_suffix((t.month % 4) + 1))
|
||||||
}
|
}
|
||||||
'c' {
|
'c' {
|
||||||
sb.write_string('${t.day_of_week() + 1}')
|
sb.write_string('${t.day_of_week()}')
|
||||||
}
|
}
|
||||||
'N' {
|
'N' {
|
||||||
// TODO: integrate BC
|
// TODO: integrate BC
|
||||||
|
@ -139,6 +139,11 @@ pub fn parse(s string) !Time {
|
|||||||
// MMMM - name of month
|
// MMMM - name of month
|
||||||
// D - day of the month, 1..31
|
// D - day of the month, 1..31
|
||||||
// DD - day of the month, 01..31
|
// DD - day of the month, 01..31
|
||||||
|
// d - day of week, 0..6
|
||||||
|
// c - day of week, 1..7
|
||||||
|
// dd - day of week, Su..Sa
|
||||||
|
// ddd - day of week, Sun..Sat
|
||||||
|
// dddd - day of week, Sunday..Saturday
|
||||||
// H - hour, 0..23
|
// H - hour, 0..23
|
||||||
// HH - hour, 00..23
|
// HH - hour, 00..23
|
||||||
// h - hour, 0..23
|
// h - hour, 0..23
|
||||||
|
@ -396,3 +396,43 @@ fn test_parse_three_letters_month() {
|
|||||||
tm_tm := time.parse_format(tm_s, format)!
|
tm_tm := time.parse_format(tm_s, format)!
|
||||||
assert tm_tm.month == tm.month
|
assert tm_tm.month == tm.month
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_parse_ordinal_weekday_d() {
|
||||||
|
format := 'd MMM DD HH:mm:ss YYYY'
|
||||||
|
dt := '0 Jan 01 00:00:00 1970'
|
||||||
|
tm := time.parse_format(dt, format)!
|
||||||
|
tm_s := tm.custom_format(format)
|
||||||
|
assert tm_s == '4 Jan 01 00:00:00 1970'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_parse_ordinal_weekday_c() {
|
||||||
|
format := 'c MMM DD HH:mm:ss YYYY'
|
||||||
|
dt := '7 Jan 01 00:00:00 1970'
|
||||||
|
tm := time.parse_format(dt, format)!
|
||||||
|
tm_s := tm.custom_format(format)
|
||||||
|
assert tm_s == '4 Jan 01 00:00:00 1970'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_parse_two_letters_weekday() {
|
||||||
|
format := 'dd MMM DD HH:mm:ss YYYY'
|
||||||
|
dt := 'Su Jan 01 00:00:00 1970'
|
||||||
|
tm := time.parse_format(dt, format)!
|
||||||
|
tm_s := tm.custom_format(format)
|
||||||
|
assert tm_s == 'Th Jan 01 00:00:00 1970'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_parse_three_letters_weekday() {
|
||||||
|
format := 'ddd MMM DD HH:mm:ss YYYY'
|
||||||
|
dt := 'Sun Jan 01 00:00:00 1970'
|
||||||
|
tm := time.parse_format(dt, format)!
|
||||||
|
tm_s := tm.custom_format(format)
|
||||||
|
assert tm_s == 'Thu Jan 01 00:00:00 1970'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_parse_weekday() {
|
||||||
|
format := 'dddd MMM DD HH:mm:ss YYYY'
|
||||||
|
dt := 'Sunday Jan 01 00:00:00 1970'
|
||||||
|
tm := time.parse_format(dt, format)!
|
||||||
|
tm_s := tm.custom_format(format)
|
||||||
|
assert tm_s == 'Thursday Jan 01 00:00:00 1970'
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user