随笔 - 934, 文章 - 0, 评论 - 249, 阅读 - 345万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

Go 3月31日减一个月是3月3日

Posted on   蝈蝈俊  阅读(66)  评论(0编辑  收藏  举报

package main

import (
	"log"
	"time"
)

func main() {
	t1 := time.Date(2022, 3, 31, 0, 0, 0, 0, time.Local)
	log.Println(t1.Format("2006-01-02 15:04:05:000"))
	t11 := t1.AddDate(0, -1, 0)
	log.Println(t11.Format("2006-01-02 15:04:05:000"))
	log.Println("---")
	t2 := time.Date(2022, 4, 1, 0, 0, 0, 0, time.Local)
	log.Println(t2.Format("2006-01-02 15:04:05:000"))
	t21 := t2.AddDate(0, -1, 0)
	log.Println(t21.Format("2006-01-02 15:04:05:000"))
}

输出

2022-03-31 00:00:00:000
2022-03-03 00:00:00:000
---
2022-04-01 00:00:00:000
2022-03-01 00:00:00:000

避坑
https://www.vicw.com/groups/code_monkey/topics/341


// AddDate 时间增减
// 类似于ruby中的时间增减,和 time.AddDate 不同
// 如:
// loc, _ := time.LoadLocation("Asia/Shanghai")
// t := time.Date(2010, 3, 31, 12, 0, 0, 0, loc)
// utils.AddDate(t, 0, 1)
// => 2010-04-30 12:00:00 +0800 CST
// 不会因为4月没有31号,而变成5月1号
func AddDate2(t time.Time, years int, months int) time.Time {
	year, month, day := t.Date()
	hour, min, sec := t.Clock()

	// firstDayOfMonthAfterAddDate: years 年,months 月后的 那个月份的1号
	firstDayOfMonthAfterAddDate := time.Date(year+years, month+time.Month(months), 1,
		hour, min, sec, t.Nanosecond(), t.Location())

	// firstDayOfMonthAfterAddDate 月份的最后一天
	lastDay := firstDayOfMonthAfterAddDate.AddDate(0, 1, 0).Add(-time.Nanosecond).Day()

	// 如果 t 的天 > lastDay,则设置为lastDay
	// 如:t 为 2020-03-31 12:00:00 +0800,增加1个月,为4月31号
	// 但是4月没有31号,则设置为4月最后一天lastDay(30号)
	if day > lastDay {
		day = lastDay
	}

	return time.Date(year+years, month+time.Month(months), day,
		hour, min, sec, t.Nanosecond(), t.Location())
}


相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2010-04-01 我碰到Cookie的一个问题
2010-04-01 IIS中ASP.net调试出现进程被打断的调整
点击右上角即可分享
微信分享提示