You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:08