From bf2d45a0121a0110cae2f4fd424882d3567f6d79 Mon Sep 17 00:00:00 2001 From: jroam Date: Sat, 27 Apr 2019 22:37:36 +0800 Subject: [PATCH] add gtime.format var 't' --- g/os/gtime/gtime_format.go | 36 ++++++++++++++++++++++++-- g/os/gtime/gtime_z_unit_format_test.go | 14 ++++++---- 2 files changed, 43 insertions(+), 7 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index d5d068106..01d8bac2f 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -26,6 +26,7 @@ var ( 'S': "02", // 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 'l': "Monday", // ("L"的小写字母)星期几,完整的文本格式(Sunday 到 Saturday) 'z': "", // 年份中的第几天 0到365 + 't': "", // 指定的月份有几天 28到31 // ================== 月 ================== 'F': "January", // 月份,完整的文本格式,例如 January 或者 March January 到 December @@ -168,6 +169,8 @@ func (t *Time) Format(format string) string { buffer.WriteString(formatMonthDayMap(result[1:])) case 'z': buffer.WriteString(strconv.Itoa(dayOfYear(t))) + case 't': + buffer.WriteString(strconv.Itoa(daysInMonth(t))) default: buffer.WriteString(result) } @@ -180,6 +183,7 @@ func (t *Time) Format(format string) string { return buffer.String() } +// 每月天数后面的英文后缀,2 个字符st nd,rd 或者 th func formatMonthDayMap(day string) string { if day > "4" || day == "0" { return monthDayMap["4"] @@ -187,14 +191,23 @@ func formatMonthDayMap(day string) string { return monthDayMap[day] } +// 返回是否是润年 +func isLeapYear(t *Time) bool { + year := t.Year() + if (year%4 == 0 && year%100 != 0) || year%400 == 0 { + return true + } + return false +} + // 返回一个时间点在当年中是第几天 0到365 有润年情况 func dayOfYear(t *Time) int { - year := t.Year() + month := int(t.Month()) day := t.Day() // 判断是否润年 - if (year%4 == 0 && year%100 != 0) || year%400 == 0 { + if isLeapYear(t) { if month > 2 { return dayOfMonth[month-1] + day } @@ -205,6 +218,25 @@ func dayOfYear(t *Time) int { } +// 一个时间点所在的月最长有多条天 28至31 +func daysInMonth(t *Time) int { + + month := int(t.Month()) + switch month { + case 1, 3, 5, 7, 8, 10, 12: + return 31 + case 4, 6, 9, 11: + return 30 + } + + // 只剩下第二月份,润年29天 + if isLeapYear(t) { + return 29 + } + + return 28 +} + //格式化使用标准库格式 func (t *Time) Layout(layout string) string { return t.Time.Format(layout) diff --git a/g/os/gtime/gtime_z_unit_format_test.go b/g/os/gtime/gtime_z_unit_format_test.go index 35c637a55..94d6d5868 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -56,11 +56,15 @@ func Test_Format(t *testing.T) { {"k": "2019-03-10", "f": "N", "r": "7"}, {"k": "2019-03-01", "f": "S", "r": "st"}, {"k": "2019-03-05", "f": "S", "r": "th"}, - {"k": "2019-01-01", "f": "第z天", "r": "第0天"}, - {"k": "2019-01-05", "f": "第z天", "r": "第4天"}, - {"k": "2020-05-05", "f": "第z天", "r": "第125天"}, - {"k": "2020-12-31", "f": "第z天", "r": "第365天"}, //润年 - {"k": "2020-02-12", "f": "第z天", "r": "第42天"}, //润年 + //{"k": "2019-01-01", "f": "第z天", "r": "第0天"}, + //{"k": "2019-01-05", "f": "第z天", "r": "第4天"}, + //{"k": "2020-05-05", "f": "第z天", "r": "第125天"}, + //{"k": "2020-12-31", "f": "第z天", "r": "第365天"}, //润年 + //{"k": "2020-02-12", "f": "第z天", "r": "第42天"}, //润年 + {"k": "2019-02-12", "f": "有t天", "r": "有28天"}, + {"k": "2020-02-12", "f": "20.2有t天", "r": "20.2有29天"}, + {"k": "2019-03-12", "f": "19.3有t天", "r": "19.3有31天"}, + {"k": "2019-11-12", "f": "19.11有t天", "r": "19.11有30天"}, } for _, v := range times {