1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

time: add new public functions for formatting

This commit is contained in:
Enrico Lefass 2019-11-01 00:13:03 +01:00 committed by Alexander Medvednikov
parent f8f7881f89
commit a691cc857e
2 changed files with 343 additions and 31 deletions

View File

@ -55,6 +55,32 @@ pub:
uni int // TODO it's safe to use "unix" now uni int // TODO it's safe to use "unix" now
} }
pub enum FormatTime {
hhmm12
hhmm24
hhmmss12
hhmmss24
no_time
}
pub enum FormatDate {
ddmmyy
ddmmyyyy
mmddyy
mmddyyyy
mmmd
mmmdd
mmmddyyyy
no_date
yyyymmdd
}
pub enum FormatDelimiter {
dot
hyphen
slash
space
}
fn C.localtime(int) &C.tm fn C.localtime(int) &C.tm
@ -174,12 +200,22 @@ pub fn convert_ctime(t tm) Time {
} }
} }
// format_ss returns a string for t in a given format YYYY-MM-DD HH:MM:SS in
// 24h notation
// @param
// @return string
// @example 1980-07-11 21:23:42
pub fn (t Time) format_ss() string { pub fn (t Time) format_ss() string {
return '${t.year}-${t.month:02d}-${t.day:02d} ${t.hour:02d}:${t.minute:02d}:${t.second:02d}' return t.get_fmt_str(.hyphen, .hhmmss24, .yyyymmdd)
} }
// format_ss returns a string for t in a given format YYYY-MM-DD HH:MM in 24h
// notation
// @param
// @return string
// @example 1980-07-11 21:23
pub fn (t Time) format() string { pub fn (t Time) format() string {
return '${t.year}-${t.month:02d}-${t.day:02d} ${t.hour:02d}:${t.minute:02d}' return t.get_fmt_str(.hyphen, .hhmm24, .yyyymmdd)
} }
@ -188,9 +224,12 @@ pub fn (t Time) smonth() string {
return months_string[i * 3..(i + 1) * 3] return months_string[i * 3..(i + 1) * 3]
} }
// 21:04 // hhmm returns a string for t in the given format HH:MM in 24h notation
// @param
// @return string
// @example 21:04
pub fn (t Time) hhmm() string { pub fn (t Time) hhmm() string {
return '${t.hour:02d}:${t.minute:02d}' return t.get_fmt_time_str(.hhmm24)
} }
/* /*
@ -199,42 +238,44 @@ fn (t Time) hhmm_tmp() string {
} }
*/ */
// 9:04pm // hhmm12 returns a string for t in the given format HH:MM in 12h notation
// @param
// @return string
// @example 9:04 p.m.
pub fn (t Time) hhmm12() string { pub fn (t Time) hhmm12() string {
mut am := 'am' return t.get_fmt_time_str(.hhmm12)
mut hour := t.hour
if t.hour > 11 {
am = 'pm'
}
if t.hour > 12 {
hour = hour - 12
}
if t.hour == 0 {
hour = 12
}
return '$hour:${t.minute:02d} $am'
} }
// 21:04:03 // hhmmss returns a string for t in the given format HH:MM:SS in 24h notation
// @param
// @return string
// @example 21:04:03
pub fn (t Time) hhmmss() string { pub fn (t Time) hhmmss() string {
return '${t.hour:02d}:${t.minute:02d}:${t.second:02d}' return t.get_fmt_time_str(.hhmmss24)
} }
// 2012-01-05 // ymmdd returns a string for t in the given format YYYY-MM-DD
// @param
// @return string
// @example 2012-01-05
pub fn (t Time) ymmdd() string { pub fn (t Time) ymmdd() string {
return '${t.year}-${t.month:02d}-${t.day:02d}' return t.get_fmt_date_str(.hyphen, .yyyymmdd)
} }
// 05.02.2012 // ddmmy returns a string for t in the given format DD.MM.YYYY
// @param
// @return string
// @example 05.02.2012
pub fn (t Time) ddmmy() string { pub fn (t Time) ddmmy() string {
return '${t.day:02d}.${t.month:02d}.${t.year}' return t.get_fmt_date_str(.dot, .ddmmyyyy)
} }
// Jul 3 // md returns a string for t in the given format MMM D
// @param
// @return string
// @example Jul 3
pub fn (t Time) md() string { pub fn (t Time) md() string {
// jl := t.smonth() return t.get_fmt_date_str(.space, .mmmd)
s := '${t.smonth()} $t.day'
return s
} }
pub fn (t Time) clean() string { pub fn (t Time) clean() string {
@ -244,7 +285,7 @@ pub fn (t Time) clean() string {
// } // }
// Today // Today
if t.month == nowe.month && t.year == nowe.year && t.day == nowe.day { if t.month == nowe.month && t.year == nowe.year && t.day == nowe.day {
return t.hhmm() return t.get_fmt_time_str(.hhmm24)
} }
// This week // This week
// if time.Since(t) < 24*7*time.Hour { // if time.Since(t) < 24*7*time.Hour {
@ -252,7 +293,7 @@ pub fn (t Time) clean() string {
// } // }
// This year // This year
if t.year == nowe.year { if t.year == nowe.year {
return '${t.smonth()} ${t.day} ${t.hhmm()}' return t.get_fmt_str(.space, .hhmm24, .mmmd)
} }
return t.format() return t.format()
// return fmt.Sprintf("%4d/%02d/%02d", t.Year(), t.Month(), t.Day()) + " " + hm // return fmt.Sprintf("%4d/%02d/%02d", t.Year(), t.Month(), t.Day()) + " " + hm
@ -265,7 +306,7 @@ pub fn (t Time) clean12() string {
// } // }
// Today // Today
if t.month == nowe.month && t.year == nowe.year && t.day == nowe.day { if t.month == nowe.month && t.year == nowe.year && t.day == nowe.day {
return t.hhmm12() return t.get_fmt_time_str(.hhmm12)
} }
// This week // This week
// if time.Since(t) < 24*7*time.Hour { // if time.Since(t) < 24*7*time.Hour {
@ -273,7 +314,7 @@ pub fn (t Time) clean12() string {
// } // }
// This year // This year
if t.year == nowe.year { if t.year == nowe.year {
return '${t.smonth()} ${t.day} ${t.hhmm12()}' return t.get_fmt_str(.space, .hhmm12, .mmmd)
} }
return t.format() return t.format()
// return fmt.Sprintf("%4d/%02d/%02d", t.Year(), t.Month(), t.Day()) + " " + hm // return fmt.Sprintf("%4d/%02d/%02d", t.Year(), t.Month(), t.Day()) + " " + hm
@ -449,3 +490,90 @@ pub fn days_in_month(month, year int) ?int {
res := month_days[month-1] + extra res := month_days[month-1] + extra
return res return res
} }
// get_fmt_time_str returns a string for time t in a given format
// @param FormatTime
// @return string
// @example 21:23:42
pub fn (t Time) get_fmt_time_str(fmt_time FormatTime) string {
if fmt_time == .no_time {
return ''
}
tp := if t.hour > 11 {
'p.m.'
} else {
'a.m.'
}
hour := if t.hour > 12 {
t.hour - 12
} else if t.hour == 0 {
12
} else {
t.hour
}
return match fmt_time {
.hhmm12 { '$hour:${t.minute:02d} $tp' }
.hhmm24 { '${t.hour:02d}:${t.minute:02d}' }
.hhmmss12 { '$hour:${t.minute:02d}:${t.second:02d} $tp' }
.hhmmss24 { '${t.hour:02d}:${t.minute:02d}:${t.second:02d}' }
else { 'unknown enumeration $fmt_time' }
}
}
// get_fmt_date_str returns a string for t in a given date format
// @param FormatDelimiter, FormatDate
// @return string
// @example 11.07.1980
pub fn (t Time) get_fmt_date_str(fmt_dlmtr FormatDelimiter, fmt_date FormatDate) string {
if fmt_date == .no_date {
return ''
}
month := '${t.smonth()}'
year := t.year.str().right(2)
return match fmt_date {
.ddmmyy { '${t.day:02d}|${t.month:02d}|$year' }
.ddmmyyyy { '${t.day:02d}|${t.month:02d}|${t.year}' }
.mmddyy { '${t.month:02d}|${t.day:02d}|$year' }
.mmddyyyy { '${t.month:02d}|${t.day:02d}|${t.year}' }
.mmmd { '$month|${t.day}' }
.mmmdd { '$month|${t.day:02d}' }
.mmmddyyyy { '$month|${t.day:02d}|${t.year}' }
.yyyymmdd { '${t.year}|${t.month:02d}|${t.day:02d}' }
else { 'unknown enumeration $fmt_date' }
}.replace('|', match fmt_dlmtr {
.dot { '.' }
.hyphen { '-' }
.slash { '/' }
.space { ' ' }
else { 'unknown enumeration $fmt_dlmtr' }
})
}
// get_fmt_str returns a string for t in a given format for time and date
// @param FormatDelimiter, FormatTime, FormatDate
// @return string
// @example 11.07.1980 21:23:42
pub fn (t Time) get_fmt_str(fmt_dlmtr FormatDelimiter, fmt_time FormatTime, fmt_date FormatDate) string {
if fmt_date == .no_date {
if fmt_time == .no_time {
// saving one function call although it's checked in
// t.get_fmt_time_str(fmt_time) in the beginning
return ''
} else {
return t.get_fmt_time_str(fmt_time)
}
} else {
if fmt_time != .no_time {
return t.get_fmt_date_str(fmt_dlmtr, fmt_date)
+ ' '
+ t.get_fmt_time_str(fmt_time)
} else {
return t.get_fmt_date_str(fmt_dlmtr, fmt_date)
}
}
}

View File

@ -50,4 +50,188 @@ fn test_unix() {
//assert t.second == 32 // TODO broken //assert t.second == 32 // TODO broken
} }
fn test_format_ss() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '11.07.1980 21:23:42' == t.get_fmt_str(.dot,
.hhmmss24,
.ddmmyyyy)
}
fn test_format() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '11.07.1980 21:23' == t.get_fmt_str(.dot,
.hhmm24,
.ddmmyyyy)
}
fn test_hhmm() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '21:23' == t.get_fmt_time_str(.hhmm24)
}
fn test_hhmm12() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '9:23 p.m.' == t.get_fmt_time_str(.hhmm12)
}
fn test_hhmmss() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '21:23:42' == t.get_fmt_time_str(.hhmmss24)
}
fn test_ymmdd() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '1980-07-11' == t.get_fmt_date_str(.hyphen,
.yyyymmdd)
}
fn test_ddmmy() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '11.07.1980' == t.get_fmt_date_str(.dot,
.ddmmyyyy)
}
fn test_md() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert 'Jul 11' == t.get_fmt_date_str(.space,
.mmmd)
}
fn test_get_fmt_time_str() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '21:23:42' == t.get_fmt_time_str(.hhmmss24)
assert '21:23' == t.get_fmt_time_str(.hhmm24)
assert '9:23:42 p.m.' == t.get_fmt_time_str(.hhmmss12)
assert '9:23 p.m.' == t.get_fmt_time_str(.hhmm12)
}
fn test_get_fmt_date_str() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
assert '11.07.1980' == t.get_fmt_date_str(.dot,
.ddmmyyyy)
assert '11/07/1980' == t.get_fmt_date_str(.slash,
.ddmmyyyy)
assert '11-07-1980' == t.get_fmt_date_str(.hyphen,
.ddmmyyyy)
assert '11 07 1980' == t.get_fmt_date_str(.space,
.ddmmyyyy)
assert '07.11.1980' == t.get_fmt_date_str(.dot,
.mmddyyyy)
assert '07/11/1980' == t.get_fmt_date_str(.slash,
.mmddyyyy)
assert '07-11-1980' == t.get_fmt_date_str(.hyphen,
.mmddyyyy)
assert '07 11 1980' == t.get_fmt_date_str(.space,
.mmddyyyy)
assert '11.07.80' == t.get_fmt_date_str(.dot,
.ddmmyy)
assert '11/07/80' == t.get_fmt_date_str(.slash,
.ddmmyy)
assert '11-07-80' == t.get_fmt_date_str(.hyphen,
.ddmmyy)
assert '11 07 80' == t.get_fmt_date_str(.space,
.ddmmyy)
assert '07.11.80' == t.get_fmt_date_str(.dot,
.mmddyy)
assert '07/11/80' == t.get_fmt_date_str(.slash,
.mmddyy)
assert '07-11-80' == t.get_fmt_date_str(.hyphen,
.mmddyy)
assert '07 11 80' == t.get_fmt_date_str(.space,
.mmddyy)
assert 'Jul 11' == t.get_fmt_date_str(.space,
.mmmd)
assert 'Jul 11' == t.get_fmt_date_str(.space,
.mmmdd)
assert 'Jul 11 1980' == t.get_fmt_date_str(.space,
.mmmddyyyy)
assert '1980-07-11' == t.get_fmt_date_str(.hyphen,
.yyyymmdd)
}
fn test_get_fmt_str() {
t := time.Time{ year: 1980,
month: 7,
day: 11,
hour: 21,
minute: 23,
second: 42,
uni: 0 }
// Since get_fmt_time_str and get_fmt_date_str do have comprehensive
// tests I don't want to exaggerate here with all possible
// combinations.
assert '11.07.1980 21:23:42' == t.get_fmt_str(.dot,
.hhmmss24,
.ddmmyyyy)
}