From 6d5b552bb727f9a73f592c3e370439ee836ed307 Mon Sep 17 00:00:00 2001 From: jroam Date: Wed, 24 Apr 2019 18:03:29 +0800 Subject: [PATCH 01/16] add param of 'N','s' to gtime.format --- g/os/gtime/gtime_format.go | 22 ++++++++++++++++++++++ g/os/gtime/gtime_z_unit_format_test.go | 14 ++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 6d74e19a3..873f34827 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -20,7 +20,9 @@ var ( 'd': "02", // 月份中的第几天,有前导零的 2 位数字(01 到 31) 'D': "Mon", // 星期中的第几天,文本表示,3 个字母(Mon 到 Sun) 'w': "Monday", // 星期中的第几天,数字型式的文本表示 0为星期天 6为星期六 + 'N': "Monday", // ISO-8601 格式数字表示的星期中的第几天 1(表示星期一)到 7(表示星期天) 'j': "=j=02", // 月份中的第几天,没有前导零(1 到 31) + 'S': "02", // 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 'l': "Monday", // ("L"的小写字母)星期几,完整的文本格式(Sunday 到 Saturday) // ================== 月 ================== @@ -64,6 +66,14 @@ var ( "Friday": "5", "Saturday": "6", } + + // 月份中的第几天数字值和英文值对应map, 最后一个数字为0或大于4时 都为'th' + monthDayMap = map[string]string{ + "1": "st", + "2": "nd", + "3": "rd", + "4": "th", + } ) // 将自定义的格式转换为标准库时间格式 @@ -147,6 +157,10 @@ func (t *Time) Format(format string) string { buffer.WriteString(strings.Replace(result, "=u=.", "", -1)) case 'w': buffer.WriteString(weekMap[result]) + case 'N': + buffer.WriteString(strings.Replace(weekMap[result], "0", "7", -1)) + case 'S': + buffer.WriteString(formatMonthDayMap(result[1:])) default: buffer.WriteString(result) } @@ -159,6 +173,14 @@ func (t *Time) Format(format string) string { return buffer.String() } +func formatMonthDayMap(days string) string { + if days > "4" || days == "0" { + return monthDayMap["4"] + } else { + return monthDayMap[days] + } +} + // 格式化,使用标准库格式 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 3d2028d29..894a206a0 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -45,9 +45,17 @@ func Test_Format(t *testing.T) { // 测试数字型的星期 times := []map[string]string{ {"k": "2019-04-22", "f": "w", "r": "1"}, + {"k": "2019-04-23", "f": "w", "r": "2"}, + {"k": "2019-04-24", "f": "w", "r": "3"}, + {"k": "2019-04-25", "f": "w", "r": "4"}, + {"k": "2019-04-26", "f": "dw", "r": "265"}, {"k": "2019-04-27", "f": "w", "r": "6"}, {"k": "2019-03-10", "f": "w", "r": "0"}, {"k": "2019-03-10", "f": "Y-m-d 星期:w", "r": "2019-03-10 星期:0"}, + {"k": "2019-04-25", "f": "N", "r": "4"}, + {"k": "2019-03-10", "f": "N", "r": "7"}, + {"k": "2019-03-01", "f": "S", "r": "st"}, + {"k": "2019-03-05", "f": "S", "r": "th"}, } for _, v := range times { @@ -56,6 +64,12 @@ func Test_Format(t *testing.T) { gtest.Assert(t1.Format(v["f"]), v["r"]) } + + + + + + }) } From 5346ca90467e09053ee20942054143a064a65d43 Mon Sep 17 00:00:00 2001 From: jroam Date: Wed, 24 Apr 2019 18:08:10 +0800 Subject: [PATCH 02/16] use golint checked --- g/os/gtime/gtime_format.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 873f34827..932236162 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -176,9 +176,8 @@ func (t *Time) Format(format string) string { func formatMonthDayMap(days string) string { if days > "4" || days == "0" { return monthDayMap["4"] - } else { - return monthDayMap[days] } + return monthDayMap[days] } // 格式化,使用标准库格式 From a0276f7e81f5f1ea0ac2c83afea51f02d2487009 Mon Sep 17 00:00:00 2001 From: jroam Date: Wed, 24 Apr 2019 23:12:48 +0800 Subject: [PATCH 03/16] add param 'z' to gtime.format func --- g/os/gtime/gtime_format.go | 33 ++++++++++++++++++++++---- g/os/gtime/gtime_z_unit_format_test.go | 5 ++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 932236162..d5d068106 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -10,6 +10,7 @@ import ( "bytes" "github.com/gogf/gf/g/text/gregex" "github.com/gogf/gf/g/text/gstr" + "strconv" "strings" ) @@ -24,6 +25,7 @@ var ( 'j': "=j=02", // 月份中的第几天,没有前导零(1 到 31) 'S': "02", // 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 'l': "Monday", // ("L"的小写字母)星期几,完整的文本格式(Sunday 到 Saturday) + 'z': "", // 年份中的第几天 0到365 // ================== 月 ================== 'F': "January", // 月份,完整的文本格式,例如 January 或者 March January 到 December @@ -74,6 +76,9 @@ var ( "3": "rd", "4": "th", } + + // 每个月累计的天数 不含润年的时候 + dayOfMonth = []int{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334} ) // 将自定义的格式转换为标准库时间格式 @@ -161,6 +166,8 @@ func (t *Time) Format(format string) string { buffer.WriteString(strings.Replace(weekMap[result], "0", "7", -1)) case 'S': buffer.WriteString(formatMonthDayMap(result[1:])) + case 'z': + buffer.WriteString(strconv.Itoa(dayOfYear(t))) default: buffer.WriteString(result) } @@ -173,14 +180,32 @@ func (t *Time) Format(format string) string { return buffer.String() } -func formatMonthDayMap(days string) string { - if days > "4" || days == "0" { +func formatMonthDayMap(day string) string { + if day > "4" || day == "0" { return monthDayMap["4"] } - return monthDayMap[days] + return monthDayMap[day] } -// 格式化,使用标准库格式 +// 返回一个时间点在当年中是第几天 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 month > 2 { + return dayOfMonth[month-1] + day + } + return dayOfMonth[month-1] + day - 1 + } + + return dayOfMonth[month-1] + day - 1 + +} + +//格式化使用标准库格式 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 894a206a0..35c637a55 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -56,6 +56,11 @@ 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天"}, //润年 } for _, v := range times { From a7122788b14f31b80fcca2556200418c0e4979ac Mon Sep 17 00:00:00 2001 From: jroam Date: Fri, 26 Apr 2019 17:52:45 +0800 Subject: [PATCH 04/16] add 'W' to gtime.format func(doing) --- g/os/gtime/gtime_format.go | 20 ++++++++++++++++++++ g/os/gtime/gtime_z_unit_format_test.go | 13 +++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index d5d068106..50e8e5d43 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -21,6 +21,7 @@ var ( 'd': "02", // 月份中的第几天,有前导零的 2 位数字(01 到 31) 'D': "Mon", // 星期中的第几天,文本表示,3 个字母(Mon 到 Sun) 'w': "Monday", // 星期中的第几天,数字型式的文本表示 0为星期天 6为星期六 + 'W': "", // ISO-8601 格式年份中的第几周,每周从星期一开始 例如:42(当年的第 42 周) 'N': "Monday", // ISO-8601 格式数字表示的星期中的第几天 1(表示星期一)到 7(表示星期天) 'j': "=j=02", // 月份中的第几天,没有前导零(1 到 31) 'S': "02", // 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 @@ -168,6 +169,9 @@ func (t *Time) Format(format string) string { buffer.WriteString(formatMonthDayMap(result[1:])) case 'z': buffer.WriteString(strconv.Itoa(dayOfYear(t))) + case 'W': + buffer.WriteString(strconv.Itoa(weeksOfYear(t))) + default: buffer.WriteString(result) } @@ -205,6 +209,22 @@ func dayOfYear(t *Time) int { } +// 获取时间点在本年内是第多少周 +// @todo: 当年的1月1号不为星期一时,那么本年的第一周要从下次的周一开始算。前面的几天算入下一个年的最后周数 +func weeksOfYear(t *Time) int { + + days := dayOfYear(t) + 1 + week := int(t.Weekday()) + if week == 0 { //每周从周一开始,星期天是7 + week = 7 + } + + n := (days+7-week)/7 + 1 //这里补齐当前时间周,得到整除,再加上第一周数 + + return n + +} + //格式化使用标准库格式 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..6d33b4fa1 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -59,8 +59,17 @@ func Test_Format(t *testing.T) { {"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": "2020-12-31", "f": "第z天", "r": "第365天"}, // 润年 + {"k": "2020-02-12", "f": "第z天", "r": "第42天"}, // 润年 + // 测试一个日期在当年是第多少周 + // 2019-01-01为星期2 + // 2017-01-01为星期日 + {"k": "2019-06-04", "f": "第W周", "r": "第23周"}, // 06-04为星期2 + {"k": "2019-05-20", "f": "第W周", "r": "第21周"}, // 05-20为星期1 + {"k": "2017-07-26", "f": "第W周", "r": "第30周"}, // 05-20为星期1 + {"k": "2017-01-02", "f": "第W周", "r": "第2周"}, // 1号是星期天为最后一天,2号为第二周的周一,每周从周一开始,但php算得有问题。 + {"k": "2015-01-02", "f": "第W周", "r": "第1周"}, //1号星期4 + } for _, v := range times { From bf2d45a0121a0110cae2f4fd424882d3567f6d79 Mon Sep 17 00:00:00 2001 From: jroam Date: Sat, 27 Apr 2019 22:37:36 +0800 Subject: [PATCH 05/16] 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 { From 0c4fa1d96a680f997cd882c6468a8f9928b8d1f5 Mon Sep 17 00:00:00 2001 From: jroam Date: Sat, 27 Apr 2019 22:50:44 +0800 Subject: [PATCH 06/16] fmt files --- g/os/gtime/gtime_format.go | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 6abaefa2b..2c9cc9f27 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -21,7 +21,7 @@ var ( 'd': "02", // 月份中的第几天,有前导零的 2 位数字(01 到 31) 'D': "Mon", // 星期中的第几天,文本表示,3 个字母(Mon 到 Sun) 'w': "Monday", // 星期中的第几天,数字型式的文本表示 0为星期天 6为星期六 - 'W': "", // ISO-8601 格式年份中的第几周,每周从星期一开始 例如:42(当年的第 42 周) + //'W': "", // ISO-8601 格式年份中的第几周,每周从星期一开始 例如:42(当年的第 42 周) 'N': "Monday", // ISO-8601 格式数字表示的星期中的第几天 1(表示星期一)到 7(表示星期天) 'j': "=j=02", // 月份中的第几天,没有前导零(1 到 31) 'S': "02", // 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 @@ -214,9 +214,7 @@ func dayOfYear(t *Time) int { } return dayOfMonth[month-1] + day - 1 } - return dayOfMonth[month-1] + day - 1 - } // 一个时间点所在的月最长有多条天 28至31 @@ -240,19 +238,19 @@ func daysInMonth(t *Time) int { // 获取时间点在本年内是第多少周 // @todo: 当年的1月1号不为星期一时,那么本年的第一周要从下次的周一开始算。前面的几天算入下一个年的最后周数 -func weeksOfYear(t *Time) int { - - days := dayOfYear(t) + 1 - week := int(t.Weekday()) - if week == 0 { //每周从周一开始,星期天是7 - week = 7 - } - - n := (days+7-week)/7 + 1 //这里补齐当前时间周,得到整除,再加上第一周数 - - return n - -} +//func weeksOfYear(t *Time) int { +// +// days := dayOfYear(t) + 1 +// week := int(t.Weekday()) +// if week == 0 { //每周从周一开始,星期天是7 +// week = 7 +// } +// +// n := (days+7-week)/7 + 1 //这里补齐当前时间周,得到整除,再加上第一周数 +// +// return n +// +//} //格式化使用标准库格式 func (t *Time) Layout(layout string) string { From 123333d9c20f3592d7fa2b13fd91d1f89da2f024 Mon Sep 17 00:00:00 2001 From: jroam Date: Sat, 27 Apr 2019 22:59:06 +0800 Subject: [PATCH 07/16] edit some info --- g/os/gtime/gtime_format.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 2c9cc9f27..4c92965e8 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -217,7 +217,7 @@ func dayOfYear(t *Time) int { return dayOfMonth[month-1] + day - 1 } -// 一个时间点所在的月最长有多条天 28至31 +// 一个时间点所在的月最长有多少天 28至31 func daysInMonth(t *Time) int { month := int(t.Month()) From a5b8e2aa2fd1b5c5dea3186ece7e4c76e33a9720 Mon Sep 17 00:00:00 2001 From: jroam Date: Sun, 28 Apr 2019 18:12:43 +0800 Subject: [PATCH 08/16] add var 'w' of gtime.format --- g/os/gtime/gtime_format.go | 25 +++++++++---------------- g/os/gtime/gtime_z_unit_format_test.go | 17 ++++++++++++----- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 4c92965e8..b3a78b151 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -21,7 +21,7 @@ var ( 'd': "02", // 月份中的第几天,有前导零的 2 位数字(01 到 31) 'D': "Mon", // 星期中的第几天,文本表示,3 个字母(Mon 到 Sun) 'w': "Monday", // 星期中的第几天,数字型式的文本表示 0为星期天 6为星期六 - //'W': "", // ISO-8601 格式年份中的第几周,每周从星期一开始 例如:42(当年的第 42 周) + 'W': "", // ISO-8601 格式年份中的第几周,每周从星期一开始 例如:42(当年的第 42 周) 'N': "Monday", // ISO-8601 格式数字表示的星期中的第几天 1(表示星期一)到 7(表示星期天) 'j': "=j=02", // 月份中的第几天,没有前导零(1 到 31) 'S': "02", // 每月天数后面的英文后缀,2 个字符 st,nd,rd 或者 th。可以和 j 一起用 @@ -53,7 +53,7 @@ var ( // ================== 时区 ================== 'O': "-0700", // 与UTC相差的小时数, 例如:+0200 'P': "-07:00", // 与UTC的差别,小时和分钟之间有冒号分隔, 例如:+02:00 - 'T': "MST", // 时区缩写, 例如:UTC,GMT,CST + 'T': "MST", // 时区缩写, 例如:UTC,GMT,CST //原来这里是MST会与php中的T获得的结果不一样。修改为CST时,就保持一致 // ================== 完整的日期/时间 ================== 'c': "2006-01-02T15:04:05-07:00", // ISO 8601 格式的日期,例如:2004-02-12T15:19:21+00:00 @@ -168,6 +168,8 @@ func (t *Time) Format(format string) string { buffer.WriteString(strings.Replace(weekMap[result], "0", "7", -1)) case 'S': buffer.WriteString(formatMonthDayMap(result[1:])) + case 'W': + buffer.WriteString(strconv.Itoa(weeksOfYear(t))) case 'z': buffer.WriteString(strconv.Itoa(dayOfYear(t))) case 't': @@ -237,20 +239,11 @@ func daysInMonth(t *Time) int { } // 获取时间点在本年内是第多少周 -// @todo: 当年的1月1号不为星期一时,那么本年的第一周要从下次的周一开始算。前面的几天算入下一个年的最后周数 -//func weeksOfYear(t *Time) int { -// -// days := dayOfYear(t) + 1 -// week := int(t.Weekday()) -// if week == 0 { //每周从周一开始,星期天是7 -// week = 7 -// } -// -// n := (days+7-week)/7 + 1 //这里补齐当前时间周,得到整除,再加上第一周数 -// -// return n -// -//} +func weeksOfYear(t *Time) int { + _,nums:=t.ISOWeek() + return nums + +} //格式化使用标准库格式 func (t *Time) Layout(layout string) string { diff --git a/g/os/gtime/gtime_z_unit_format_test.go b/g/os/gtime/gtime_z_unit_format_test.go index 3923ef361..7625a16ff 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -57,15 +57,22 @@ func Test_Format(t *testing.T) { {"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天"}, + {"k": "2019-01-01", "f": "第W周", "r": "第1周"}, + {"k": "2017-01-01", "f": "第W周", "r": "第52周"},//星期7 + {"k": "2002-01-01", "f": "第W周为星期2", "r": "第1周为星期2"},//星期2 + {"k": "2016-01-01", "f": "第W周为星期5", "r": "第53周为星期5"}, //星期5 + {"k": "2014-01-01", "f": "第W周为星期3", "r": "第1周为星期3"}, //星期3 + {"k": "2015-01-01", "f": "第W周为星期4", "r": "第1周为星期4"}, //星期4 + {"k": "2015-01-01", "f": "时区T", "r": "时区PRC"}, //星期4 } for _, v := range times { From 6d7d8dec0278f98b614c0384d61320c53f04f50d Mon Sep 17 00:00:00 2001 From: jroam Date: Sun, 28 Apr 2019 22:53:03 +0800 Subject: [PATCH 09/16] add var 'e' of gtime.format --- g/os/gtime/gtime_format.go | 16 +++++++++++++++- g/os/gtime/gtime_z_unit_format_test.go | 13 +++++++------ 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index b3a78b151..692ff3ddb 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -12,6 +12,7 @@ import ( "github.com/gogf/gf/g/text/gstr" "strconv" "strings" + "time" ) var ( @@ -54,6 +55,7 @@ var ( 'O': "-0700", // 与UTC相差的小时数, 例如:+0200 'P': "-07:00", // 与UTC的差别,小时和分钟之间有冒号分隔, 例如:+02:00 'T': "MST", // 时区缩写, 例如:UTC,GMT,CST //原来这里是MST会与php中的T获得的结果不一样。修改为CST时,就保持一致 + 'e': "", // 时区缩写, 例如:UTC,GMT,CST ,这与当前操作系统有关 // ================== 完整的日期/时间 ================== 'c': "2006-01-02T15:04:05-07:00", // ISO 8601 格式的日期,例如:2004-02-12T15:19:21+00:00 @@ -174,6 +176,8 @@ func (t *Time) Format(format string) string { buffer.WriteString(strconv.Itoa(dayOfYear(t))) case 't': buffer.WriteString(strconv.Itoa(daysInMonth(t))) + case 'e': + buffer.WriteString(zeroLocation()) default: buffer.WriteString(result) } @@ -240,11 +244,21 @@ func daysInMonth(t *Time) int { // 获取时间点在本年内是第多少周 func weeksOfYear(t *Time) int { - _,nums:=t.ISOWeek() + _, nums := t.ISOWeek() return nums } +func zeroLocation() string { + + location, err := time.LoadLocation("") + if err != nil { + return "" + } + return location.String() + +} + //格式化使用标准库格式 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 7625a16ff..00836f93e 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -61,18 +61,19 @@ func Test_Format(t *testing.T) { {"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": "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天"}, {"k": "2019-01-01", "f": "第W周", "r": "第1周"}, - {"k": "2017-01-01", "f": "第W周", "r": "第52周"},//星期7 - {"k": "2002-01-01", "f": "第W周为星期2", "r": "第1周为星期2"},//星期2 + {"k": "2017-01-01", "f": "第W周", "r": "第52周"}, //星期7 + {"k": "2002-01-01", "f": "第W周为星期2", "r": "第1周为星期2"}, //星期2 {"k": "2016-01-01", "f": "第W周为星期5", "r": "第53周为星期5"}, //星期5 - {"k": "2014-01-01", "f": "第W周为星期3", "r": "第1周为星期3"}, //星期3 - {"k": "2015-01-01", "f": "第W周为星期4", "r": "第1周为星期4"}, //星期4 - {"k": "2015-01-01", "f": "时区T", "r": "时区PRC"}, //星期4 + {"k": "2014-01-01", "f": "第W周为星期3", "r": "第1周为星期3"}, //星期3 + {"k": "2015-01-01", "f": "第W周为星期4", "r": "第1周为星期4"}, //星期4 + {"k": "2015-01-01", "f": "时区T", "r": "时区CST"}, + {"k": "2015-01-01", "f": "时区e", "r": "时区UTC"}, } for _, v := range times { From 898ec21a2506ca98c9cff7872d118149d309f3cd Mon Sep 17 00:00:00 2001 From: jroam Date: Sun, 28 Apr 2019 23:00:07 +0800 Subject: [PATCH 10/16] del mod contents of 'go1.12' --- go.mod | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 081d99cd0..fd3232e72 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1 @@ -module github.com/gogf/gf - -go 1.12 +module github.com/gogf/gf \ No newline at end of file From a177e44583fe12f287dc4fbdcb401a57b88b79ad Mon Sep 17 00:00:00 2001 From: jroam Date: Mon, 29 Apr 2019 14:29:33 +0800 Subject: [PATCH 11/16] edit some infos --- g/os/gtime/gtime_format.go | 4 ++-- go.mod | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 692ff3ddb..e18d62048 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -54,8 +54,8 @@ var ( // ================== 时区 ================== 'O': "-0700", // 与UTC相差的小时数, 例如:+0200 'P': "-07:00", // 与UTC的差别,小时和分钟之间有冒号分隔, 例如:+02:00 - 'T': "MST", // 时区缩写, 例如:UTC,GMT,CST //原来这里是MST会与php中的T获得的结果不一样。修改为CST时,就保持一致 - 'e': "", // 时区缩写, 例如:UTC,GMT,CST ,这与当前操作系统有关 + 'T': "MST", // 时区缩写, 例如:UTC,GMT,CST + 'e': "", // 时区缩写, 例如:UTC,GMT,CST ,这与当前操作系统设置的时区有关,在中国基本上是UTC // ================== 完整的日期/时间 ================== 'c': "2006-01-02T15:04:05-07:00", // ISO 8601 格式的日期,例如:2004-02-12T15:19:21+00:00 diff --git a/go.mod b/go.mod index fd3232e72..081d99cd0 100644 --- a/go.mod +++ b/go.mod @@ -1 +1,3 @@ -module github.com/gogf/gf \ No newline at end of file +module github.com/gogf/gf + +go 1.12 From 5d0c8956d6c5bf169463da9ef0e6549eb3356667 Mon Sep 17 00:00:00 2001 From: jroam Date: Tue, 30 Apr 2019 11:45:26 +0800 Subject: [PATCH 12/16] edit some errs and fmt some codes --- g/os/gtime/gtime_format.go | 39 ++++++++++---------------- g/os/gtime/gtime_z_unit_format_test.go | 2 ++ go.mod | 3 +- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index e18d62048..ec8c610d2 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -54,8 +54,8 @@ var ( // ================== 时区 ================== 'O': "-0700", // 与UTC相差的小时数, 例如:+0200 'P': "-07:00", // 与UTC的差别,小时和分钟之间有冒号分隔, 例如:+02:00 - 'T': "MST", // 时区缩写, 例如:UTC,GMT,CST - 'e': "", // 时区缩写, 例如:UTC,GMT,CST ,这与当前操作系统设置的时区有关,在中国基本上是UTC + 'T': "MST", // 时区缩写, 本机所在的时区 CST可视为美国、澳大利亚、古巴或中国的标准时间 + 'e': "", // 时区标识, 例如:UTC,GMT,CST ,这与当前操作系统设置的时区有关,在中国基本上是UTC // ================== 完整的日期/时间 ================== 'c': "2006-01-02T15:04:05-07:00", // ISO 8601 格式的日期,例如:2004-02-12T15:19:21+00:00 @@ -73,14 +73,6 @@ var ( "Saturday": "6", } - // 月份中的第几天数字值和英文值对应map, 最后一个数字为0或大于4时 都为'th' - monthDayMap = map[string]string{ - "1": "st", - "2": "nd", - "3": "rd", - "4": "th", - } - // 每个月累计的天数 不含润年的时候 dayOfMonth = []int{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334} ) @@ -169,7 +161,7 @@ func (t *Time) Format(format string) string { case 'N': buffer.WriteString(strings.Replace(weekMap[result], "0", "7", -1)) case 'S': - buffer.WriteString(formatMonthDayMap(result[1:])) + buffer.WriteString(formatMonthDayMap(result)) case 'W': buffer.WriteString(strconv.Itoa(weeksOfYear(t))) case 'z': @@ -192,10 +184,18 @@ func (t *Time) Format(format string) string { // 每月天数后面的英文后缀,2 个字符st nd,rd 或者 th func formatMonthDayMap(day string) string { - if day > "4" || day == "0" { - return monthDayMap["4"] + switch day { + case "01": + return "st" + case "02": + return "nd" + case "03": + return "rd" + case "": + return "" + default: + return "th" } - return monthDayMap[day] } // 返回是否是润年 @@ -209,7 +209,6 @@ func isLeapYear(t *Time) bool { // 返回一个时间点在当年中是第几天 0到365 有润年情况 func dayOfYear(t *Time) int { - month := int(t.Month()) day := t.Day() @@ -225,7 +224,6 @@ 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: @@ -238,7 +236,6 @@ func daysInMonth(t *Time) int { if isLeapYear(t) { return 29 } - return 28 } @@ -246,17 +243,11 @@ func daysInMonth(t *Time) int { func weeksOfYear(t *Time) int { _, nums := t.ISOWeek() return nums - } func zeroLocation() string { - - location, err := time.LoadLocation("") - if err != nil { - return "" - } + location, _ := time.LoadLocation("") return location.String() - } //格式化使用标准库格式 diff --git a/g/os/gtime/gtime_z_unit_format_test.go b/g/os/gtime/gtime_z_unit_format_test.go index 00836f93e..524a974a1 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -55,6 +55,8 @@ func Test_Format(t *testing.T) { {"k": "2019-04-25", "f": "N", "r": "4"}, {"k": "2019-03-10", "f": "N", "r": "7"}, {"k": "2019-03-01", "f": "S", "r": "st"}, + {"k": "2019-03-02", "f": "S", "r": "nd"}, + {"k": "2019-03-03", "f": "S", "r": "rd"}, {"k": "2019-03-05", "f": "S", "r": "th"}, {"k": "2019-01-01", "f": "第z天", "r": "第0天"}, diff --git a/go.mod b/go.mod index 28729e4f6..fd3232e72 100644 --- a/go.mod +++ b/go.mod @@ -1,2 +1 @@ -module github.com/gogf/gf - +module github.com/gogf/gf \ No newline at end of file From d78fde8099b678b17cf265f92bebb12222ed9d34 Mon Sep 17 00:00:00 2001 From: "yybjroam@qq.com" Date: Tue, 30 Apr 2019 22:31:52 +0800 Subject: [PATCH 13/16] edit a func's name --- g/os/gtime/gtime_format.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index ec8c610d2..db5c26f9c 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -161,7 +161,7 @@ func (t *Time) Format(format string) string { case 'N': buffer.WriteString(strings.Replace(weekMap[result], "0", "7", -1)) case 'S': - buffer.WriteString(formatMonthDayMap(result)) + buffer.WriteString(formatMonthDaySuffixMap(result)) case 'W': buffer.WriteString(strconv.Itoa(weeksOfYear(t))) case 'z': @@ -183,7 +183,7 @@ func (t *Time) Format(format string) string { } // 每月天数后面的英文后缀,2 个字符st nd,rd 或者 th -func formatMonthDayMap(day string) string { +func formatMonthDaySuffixMap(day string) string { switch day { case "01": return "st" From 5761e73061d9d8a8e97ec745e950f092db290d7e Mon Sep 17 00:00:00 2001 From: jroam Date: Sat, 4 May 2019 18:14:05 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/os/gtime/gtime_format.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index db5c26f9c..09c2ec51e 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -140,6 +140,14 @@ func (t *Time) Format(format string) string { } else { return buffer.String() } + case 'W': + buffer.WriteString(strconv.Itoa(weeksOfYear(t))) + case 'z': + buffer.WriteString(strconv.Itoa(dayOfYear(t))) + case 't': + buffer.WriteString(strconv.Itoa(daysInMonth(t))) + case 'e': + buffer.WriteString(zeroLocation()) default: if runes[i] > 255 { @@ -162,14 +170,6 @@ func (t *Time) Format(format string) string { buffer.WriteString(strings.Replace(weekMap[result], "0", "7", -1)) case 'S': buffer.WriteString(formatMonthDaySuffixMap(result)) - case 'W': - buffer.WriteString(strconv.Itoa(weeksOfYear(t))) - case 'z': - buffer.WriteString(strconv.Itoa(dayOfYear(t))) - case 't': - buffer.WriteString(strconv.Itoa(daysInMonth(t))) - case 'e': - buffer.WriteString(zeroLocation()) default: buffer.WriteString(result) } @@ -191,8 +191,6 @@ func formatMonthDaySuffixMap(day string) string { return "nd" case "03": return "rd" - case "": - return "" default: return "th" } From a5b536e218051b0b53444a0479fb3f4696c3cf4b Mon Sep 17 00:00:00 2001 From: jroam Date: Sun, 5 May 2019 22:49:52 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E4=B8=8D=E5=B8=B8?= =?UTF-8?q?=E7=94=A8=E5=8F=82=E6=95=B0e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/os/gtime/gtime_format.go | 14 ++------------ g/os/gtime/gtime_z_unit_format_test.go | 2 -- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 09c2ec51e..6b44275c9 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -12,7 +12,6 @@ import ( "github.com/gogf/gf/g/text/gstr" "strconv" "strings" - "time" ) var ( @@ -54,8 +53,7 @@ var ( // ================== 时区 ================== 'O': "-0700", // 与UTC相差的小时数, 例如:+0200 'P': "-07:00", // 与UTC的差别,小时和分钟之间有冒号分隔, 例如:+02:00 - 'T': "MST", // 时区缩写, 本机所在的时区 CST可视为美国、澳大利亚、古巴或中国的标准时间 - 'e': "", // 时区标识, 例如:UTC,GMT,CST ,这与当前操作系统设置的时区有关,在中国基本上是UTC + 'T': "MST", // 时区缩写, 例如: UTC, EST, MDT // ================== 完整的日期/时间 ================== 'c': "2006-01-02T15:04:05-07:00", // ISO 8601 格式的日期,例如:2004-02-12T15:19:21+00:00 @@ -146,9 +144,6 @@ func (t *Time) Format(format string) string { buffer.WriteString(strconv.Itoa(dayOfYear(t))) case 't': buffer.WriteString(strconv.Itoa(daysInMonth(t))) - case 'e': - buffer.WriteString(zeroLocation()) - default: if runes[i] > 255 { buffer.WriteRune(runes[i]) @@ -243,12 +238,7 @@ func weeksOfYear(t *Time) int { return nums } -func zeroLocation() string { - location, _ := time.LoadLocation("") - return location.String() -} - -//格式化使用标准库格式 +// 格式化使用标准库格式 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 524a974a1..6a67df146 100644 --- a/g/os/gtime/gtime_z_unit_format_test.go +++ b/g/os/gtime/gtime_z_unit_format_test.go @@ -74,8 +74,6 @@ func Test_Format(t *testing.T) { {"k": "2016-01-01", "f": "第W周为星期5", "r": "第53周为星期5"}, //星期5 {"k": "2014-01-01", "f": "第W周为星期3", "r": "第1周为星期3"}, //星期3 {"k": "2015-01-01", "f": "第W周为星期4", "r": "第1周为星期4"}, //星期4 - {"k": "2015-01-01", "f": "时区T", "r": "时区CST"}, - {"k": "2015-01-01", "f": "时区e", "r": "时区UTC"}, } for _, v := range times { From d525c048269cd2ac24b7c848d03929db59fe63e5 Mon Sep 17 00:00:00 2001 From: jroam Date: Mon, 6 May 2019 15:03:14 +0800 Subject: [PATCH 16/16] =?UTF-8?q?=E5=85=AC=E5=BC=80=E5=87=A0=E4=B8=AA?= =?UTF-8?q?=E5=B8=B8=E7=94=A8=E5=8A=9F=E8=83=BD=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/os/gtime/gtime_format.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/g/os/gtime/gtime_format.go b/g/os/gtime/gtime_format.go index 6b44275c9..79e8dc807 100644 --- a/g/os/gtime/gtime_format.go +++ b/g/os/gtime/gtime_format.go @@ -139,11 +139,11 @@ func (t *Time) Format(format string) string { return buffer.String() } case 'W': - buffer.WriteString(strconv.Itoa(weeksOfYear(t))) + buffer.WriteString(strconv.Itoa(t.WeeksOfYear())) case 'z': - buffer.WriteString(strconv.Itoa(dayOfYear(t))) + buffer.WriteString(strconv.Itoa(t.DayOfYear())) case 't': - buffer.WriteString(strconv.Itoa(daysInMonth(t))) + buffer.WriteString(strconv.Itoa(t.DaysInMonth())) default: if runes[i] > 255 { buffer.WriteRune(runes[i]) @@ -192,7 +192,7 @@ func formatMonthDaySuffixMap(day string) string { } // 返回是否是润年 -func isLeapYear(t *Time) bool { +func (t *Time)IsLeapYear() bool { year := t.Year() if (year%4 == 0 && year%100 != 0) || year%400 == 0 { return true @@ -201,12 +201,12 @@ func isLeapYear(t *Time) bool { } // 返回一个时间点在当年中是第几天 0到365 有润年情况 -func dayOfYear(t *Time) int { +func (t *Time)DayOfYear() int { month := int(t.Month()) day := t.Day() // 判断是否润年 - if isLeapYear(t) { + if t.IsLeapYear() { if month > 2 { return dayOfMonth[month-1] + day } @@ -216,7 +216,7 @@ func dayOfYear(t *Time) int { } // 一个时间点所在的月最长有多少天 28至31 -func daysInMonth(t *Time) int { +func (t *Time)DaysInMonth() int { month := int(t.Month()) switch month { case 1, 3, 5, 7, 8, 10, 12: @@ -226,14 +226,14 @@ func daysInMonth(t *Time) int { } // 只剩下第二月份,润年29天 - if isLeapYear(t) { + if t.IsLeapYear() { return 29 } return 28 } // 获取时间点在本年内是第多少周 -func weeksOfYear(t *Time) int { +func (t *Time)WeeksOfYear() int { _, nums := t.ISOWeek() return nums }