# YAGTF Yet Another Golang Time Formatter ## English Documentation ### Tradition Mode Directly using the format string like 'yyyy-MM-dd HH:mm:ss'. It will be translated into advanced mode format string by simply string replacing. Just for compatibility, not recommend for complex format. Symbols: |Symbol | Function Description | Will Be Replaced To | Output Example | |:-: | :-: | :-: | :-: | |yyyy | long year | <year> | 2019 | |yy | short year | <shortYear> | 96 | |MM | month with zero fill | <month> | 02 | |M3 | month in English abbr. | <monthAbbr> | Jan | |M09 | month in English with zero fill | <monthName> | January | |M9 | month in English without zero fill | <monthNameNoFill> | January | |M | month without zero fill | <monthNoFill> | 2 | |dd | day with zero fill | <day> | 05 | |d | day without zero fill | <dayNoFill> | 5 | |HH | 24h hour with zero fill | <hour24> | 13 | |hh | 12h hour with zero fill | <hour12> | 01 | |H | 24h hour without zero fill | <hour24NoFill> | 13 | |h | 12h hour without zero fill | <hour12NoFill> | 1 | |mm | minute with zero fill | <minute> | 01 | |ss | second with zero fill | <second> | 05 | |E09 | weekday in English with zero fill | <weekdayName> | Monday | |E9 | weekday in English without zero fill | <weekdayNameNoFill> | Monday | |E3 | weekday in English abbr. | <weekdayAbbr> | Mon | |A | AM/PM | <ampm> | AM | |S1 | millisecond | <ms> | 026 | |S2 | microsecond | <us> | 114514 | |S3 | nanosecond | <ns> | 019810019 | |Z | timezone abbr. | <timezoneAbbr> | CST | |z | timezone UTC offset | <timezone> | +0800 | Examples: `yyyy-MM-dd HH:mm:ss` -> `2000-02-15 19:27:35` `yy M3 dd E09 hh:mm:ss.S2 A` -> `96 Nov 14 Thursday 01:05:27.114514 PM` ### Advanced Mode Start your format string with `!`. If you want to use tradition mode, but your formatting string start with `!`, please start with `!!` to instead of `!`. (The `!` in middle of string will be auto-escaped) #### Pure Text Directly type pure text. For escaping `!`, use `` Examples: `hello, gensokyo` -> `hello, gensokyo!` #### Tag Use `<` and `>` to wrap the name of tag. For escaping `<` and '>', using `` and `` Examples: `--` -> `2019-01-02` `::` -> `<16:05:27>!` #### Non-display Tags Some of tags will not be displayed, they just be used for set some options. Examples: `:` -> `08:05` #### Display Tag List |Tag | Function Description | Output Example | |:-: | :-: | :-: | |<year> | long year | 2019 | |<shortYear> | short year | 96 | |<month> | month with zero fill | 02 | |<monthNoFill> | month without zero fill | 2 | |<monthAbbr> | month in English abbr. | Jan | |<monthName> | month in English with zero fill | January | |<monthNameNoFill> | month in English without zero fill | January | |<day> | day with zero fill | 05 | |<dayNoFill> | day without zero fill | 5 | |<hour24> | 24h hour with zero fill | 13 | |<hour12> | 12h hour with zero fill | 01 | |<hour24NoFill> | 24h hour without zero fill | 13 | |<hour12NoFill> | 12h hour without zero fill | 1 | |<minute> | minute with zero fill | 01 | |<second> | second with zero fill | 05 | |<weekday> | weekday in numberic | 1 | |<weekdayName> | weekday in English with zero fill | Monday | |<weekdayNameNoFill> | weekday in English without zero fill | Monday | |<weekdayAbbr> | weekday in English abbr. | Mon | |<ampm> | AM/PM | AM | |<ms> | millisecond | 026 | |<us> | microsecond | 114514 | |<ns> | nanosecond | 019810019 | |<yearweek> | the week in this year with zero fill | 06 | |<yearweekNoFill> | the week in this year without zero fill | 6 | |<yearday> | the day in this year with zero fill | 034 | |<yeardayNoFill> | the day in this year without zero fill | 34 | |<timezone> | timezone UTC offset | +0800 | |<timezoneAbbr> | timezone abbr. | CST | |<timezoneSec> | timezone offset in seconds with zero fill | 03600 | |<timezoneSecNoFill> | timezone offset in seconds without zero fill | 3600 | |<iso8601date> | ISO8601 date | 2019-01-01 | |<iso8601time> | ISO8601 time | 19:28:31 | |<iso8601full> | ISO8601 full format | 2019-01-01T19:28:31+0800 | |<common> | common format | 2019-01-01 19:28:31 | |<nginx> | nginx default time format | 01/Jan/2019:19:28:31 +0800 | |<!> | exclamation mark | ! | |<lt> | less-than mark | < | |<gt> | great-than mark | > | |<q> | quote mark | " | |<sq> | single quote mark | ' | |<sp> | space | | |<tab> | tab | | |<br> | linebreak '\n' (valid in multi-line mode only) | | |<cr> | linebreak '\r' (valid in multi-line mode only) | | #### Alias |Alias | For Tag | |:-: | :-: | |<y> | <year> | |<sy> | <shortYear> | |<mon> | <month> | |<monNF> | <monthNoFill> | |<monA> | <monthAbbr> | |<monN> | <monthName> | |<monNNF> | <monthNameNoFill> | |<d> | <day> | |<dNF> | <dayNoFill> | |<h24> | <hour24> | |<h12> | <hour12> | |<h24NF> | <hour24NoFill> | |<h12NF> | <hour12NoFill> | |<min> | <minute> | |<s> | <second> | |<wd> | <weekday> | |<wdN> | <weekdayName> | |<wdNNF> | <weekdayNameNoFill> | |<wdA> | <weekdayAbbr> | |<yw> | <yearweek> | |<ywNF> | <yearweekNoFill> | |<yd> | <yearday> | |<ydNF> | <yeardayNoFill> | |<tz> | <timezone> | |<tzA> | <timezoneAbbr> | |<tzS> | <timezoneSec> | |<tzSNF> | <timezoneSecNoFill> | |<i8d> | <iso8601date> | |<i8t> | <iso8601time> | |<i8f> | <iso8601full> | |<lf> | <br> | ### Non-display Tag List |Tag | Function Description | |:-: | :-: | |<UTC> | use UTC timezone for output | |<Local> | use local timezone for output | |<Timezone:> | *use specified timezone for output | * Instuction For `` Tag: Specified timezone to use follow the colon. Using UTC offset format with name followed. Example: `` will specified the timezone to CST(+0800) for output. ### External Tags By Using TimeFormatterEx, you can append your custom tags. ### Using This Package In Go *Installation* ``` go get git.swzry.com/zry/YAGTF ``` *Coding* With Basic Formatter ``` package main import ( "fmt" "git.swzry.com/zry/YAGTF/yagtf/timefmt" "time" ) func main() { tf := timefmt.NewDefaultTimeFormatter("!-- :: ", false) fmt.Println(tf.Format(time.Now())) tf = timefmt.NewDefaultTimeFormatter("!-- :: ", false) fmt.Println(tf.Format(time.Now())) tf = timefmt.NewDefaultTimeFormatter("!-- ::
", true) fmt.Println(tf.Format(time.Now())) tf = timefmt.NewDefaultTimeFormatter("!-- ::
", false) fmt.Println(tf.Format(time.Now())) tf = timefmt.NewDefaultTimeFormatter("yyyy-MM-dd HH:mm:ss z Z", false) fmt.Println(tf.Format(time.Now())) tf = timefmt.NewDefaultTimeFormatter("!yyyy-MM-dd HH:mm:ss z Z", false) fmt.Println(tf.Format(time.Now())) tf = timefmt.NewDefaultTimeFormatter("!!yyyy-MM-dd HH:mm:ss z Z", false) fmt.Println(tf.Format(time.Now())) } ``` With TimeFormatterEx: ``` package main import ( "fmt" "git.swzry.com/zry/YAGTF/yagtf/tfelem" "git.swzry.com/zry/YAGTF/yagtf/timefmt" "time" ) func main() { printer := timefmt.NewTimePrinterEx() parser := timefmt.NewFormatParser(true) parser.AddExDataTag("level", func() timefmt.TimeElementEx { return tfelem.NewExDataElement(4, "level") }) parser.AddExDataTag("app", func() timefmt.TimeElementEx { return tfelem.NewExDataElement(64, "app") }) parser.AddExDataTag("msg", func() timefmt.TimeElementEx { return tfelem.NewExDataElement(2048, "msg") }) tf := timefmt.NewTimeFormatterEx(printer, parser, false) tf.ParseFormat("![-- :: ] : ") logtest(tf, "INFO", "test1.app", "hello, world") logtest(tf, "WARN", "test2.app", "hello, gensokyo") logtest(tf, "INFO", "test3.app", "the quick brown fox jumps over a lazy dog.") logtest(tf, "INFO", "test4.app", "Unicode Test With Emoji 1:โ˜โšก๐Ÿช๐Ÿ—๏ธ๐Ÿ‘จ, ๐Ÿ‘จ๐Ÿ’ก, ๐Ÿ“โœ”๏ธ. โ›ชโŒ๐Ÿ“. โ˜โšก, โ˜โšกโ›ช, โ›ช๐Ÿ”ฅ, ๐Ÿข๏ธ๐Ÿ“โœ”๏ธ.") logtest(tf, "INFO", "test5.app", "Unicode Test With Emoji 2:๐Ÿ‡จ๐Ÿ‡ณ, 1980 < ๐Ÿ“… < 2015, ๐Ÿ‘ถโœ–๏ธ1 = โœ”๏ธ; ๐Ÿ“… > 2015, ๐Ÿ‘ถโœ–๏ธ2 = โœ”๏ธ.") logtest(tf, "INFO", "test6.app", "Unicode Test With Emoji 3:๐Ÿ‘ฆโœ‚๐Ÿ”Œ, โšก๐Ÿ‘ฆ, ๐Ÿš‘๐Ÿฅ, ๐Ÿ˜ท๐Ÿ’‰, ๐Ÿ˜ท๐Ÿ˜ฑ, ๐Ÿ‘ฆโ˜ ๏ธ. ๐Ÿ‘ต๐Ÿฝ๐Ÿ˜ญ, ๐Ÿ’ดโšฐ๏ธ, ๐Ÿ‘ฎโšฐ๏ธโŒ, ๐Ÿ”ฅ๐Ÿ’€->โšฑ๏ธโœ”๏ธ.") logtest(tf, "INFO", "test7.app", "Unicode Test With Emoji 4:๐Ÿ‘ฆ๐Ÿšฌ๐Ÿš„, ๐Ÿ‘ฎ๐Ÿšญ, ๐Ÿ’ด, ๐Ÿ‘ฆ๐Ÿ‘ฟ, ๐Ÿ‘ฆ๐Ÿ’ฃ๐Ÿ’ฅ๐Ÿš”, ๐Ÿ‘ฎ๐Ÿ˜ฑ, ๐Ÿ‘ฎ๐Ÿ”ซ๐Ÿ‘ฆ, ๐Ÿ‘ฆโ˜ ๏ธ.") logtest(tf, "INFO", "test8.app", "Unicode Test With Chinese and Emoji: ้ญ”็†ๆฒ™ๅท่ตฐไบ†้‡่ฆ็š„๐Ÿ“š, ๅธ•็ง‹่Ž‰๐Ÿ‘ฟ.") } func logtest(tf *timefmt.TimeFormatterEx, level string, app string, msg string) { exdata := make(map[string]string) exdata["level"] = level exdata["app"] = app exdata["msg"] = msg fmt.Println(tf.Format(time.Now(), exdata)) } ``` ## ไธญๆ–‡ๆ–‡ๆกฃ ๅพ…ๅฎŒๅ–„...