如何对D.MM/DD.MM格式的日期字符串切片按规则升序排序?
解决Go语言中D.MM/DD.MM格式日期字符串的排序问题
我明白你遇到的问题了——用float64解析这种日期字符串来排序确实会踩坑!比如"12.02"转成浮点数是12.02,"1.03"是1.03,排序时会错误地把2月12日排在3月1日后面,完全不符合「先月份升序,月内日期升序」的需求。
正确的解决方案:自定义排序逻辑
核心思路是把每个日期字符串拆分成日期和月份两个整数,然后按「月份优先,日期次之」的规则排序。Go的sort.Slice函数可以轻松实现自定义排序逻辑,具体步骤如下:
- 对每个待排序的字符串,用
strings.Split按.分割成日期和月份两部分; - 将分割后的字符串转换为整数(比如
"02"转成int就是2,不影响月份判断); - 先比较月份:月份小的排前面;如果月份相同,再比较日期,日期小的排前面。
完整代码示例
package main import ( "fmt" "sort" "strconv" "strings" ) func main() { // 示例输入切片 var keys = []string{"1.03", "31.12", "2.02", "1.02", "3.02"} // 自定义排序规则 sort.Slice(keys, func(i, j int) bool { // 分割两个待比较的字符串 partsI := strings.Split(keys[i], ".") partsJ := strings.Split(keys[j], ".") // 转换为整数(题目保证格式合法,忽略错误处理) dayI, _ := strconv.Atoi(partsI[0]) monthI, _ := strconv.Atoi(partsI[1]) dayJ, _ := strconv.Atoi(partsJ[0]) monthJ, _ := strconv.Atoi(partsJ[1]) // 先比月份,再比日期 if monthI != monthJ { return monthI < monthJ } return dayI < dayJ }) fmt.Println(keys) // 输出结果:[1.02 2.02 3.02 1.03 31.12] }
额外说明
- 代码中忽略了
strconv.Atoi的错误处理,因为题目明确所有元素都是合法的D.MM或DD.MM格式。如果实际场景可能存在非法字符串,建议加上错误捕获逻辑,避免程序崩溃。 - 这种方法完全基于日期的业务逻辑排序,从根源上避免了浮点数解析带来的逻辑错误,排序结果完全符合预期。
内容的提问来源于stack exchange,提问作者fallais
相关产品推荐
相关产品推荐

