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

如何在Go语言中生成YYYY-MM-DD格式的起止日期范围?

Go语言中生成指定日期范围的更优方法

假设我们的输入是start_date=2022-01-01和end_date=2022-01-05,需要生成如下格式的日期列表:

2022-01-01
2022-01-02
2022-01-03
2022-01-04

我已经知道可以用time.Parse解析起止日期,通过.Sub计算间隔天数,再循环生成日期字符串,但想了解Go语言中是否有更简洁高效的日期范围生成方法?


在Go语言里,标准库本身没有直接生成日期范围的函数,但可以用更直观可靠的方式实现——直接在循环中逐天递增日期,直到触达结束日期边界,这种方式能避免手动计算天数的潜在误差,还能自动处理跨月、跨年等特殊场景。

示例代码如下:

package main

import (
	"fmt"
	"time"
)

func generateDateRange(startStr, endStr string) ([]string, error) {
	layout := "2006-01-02"
	startDate, err := time.Parse(layout, startStr)
	if err != nil {
		return nil, err
	}
	endDate, err := time.Parse(layout, endStr)
	if err != nil {
		return nil, err
	}

	var dates []string
	currentDate := startDate
	// 循环到当前日期小于结束日期时停止
	for currentDate.Before(endDate) {
		dates = append(dates, currentDate.Format(layout))
		// 逐天递增,自动处理各类日期边界情况
		currentDate = currentDate.AddDate(0, 0, 1)
	}

	return dates, nil
}

func main() {
	dates, err := generateDateRange("2022-01-01", "2022-01-05")
	if err != nil {
		fmt.Println("生成日期列表出错:", err)
		return
	}
	for _, date := range dates {
		fmt.Println(date)
	}
}

这种实现的优势:

  • 逻辑直观,无需手动计算天数差,用time.Before判断终止条件更清晰
  • AddDate(0,0,1)是标准库提供的安全日期递增方法,自动处理闰年、月末跳转等特殊情况,比直接操作时间戳更可靠
  • 代码简洁易读,可直接封装为工具函数复用

内容的提问来源于stack exchange,提问作者Alireza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:45:36