golang 计算几个自然月的某一天

比如说 

2021-01-30 之后5个月 变为 2021-06-29

2021-01-30 之后1个月 变为 2021-02-28

2020-12-01 之后1个月 变为 2020-12-31

 

package main

import (
	"strconv"
	"time"
)

const (
	minYear = 1678
	maxYear = 2262
)

func isLeapYear(yeartime int64) bool {
	if (yeartime % 4 == 0 && yeartime % 100 != 0 ) || yeartime % 400 ==0 {
		return true
	}
	return false
}

func ConvertIntToString(src int64) string {
	dest := strconv.FormatInt(src, 10)
	return dest
}

func GetTime(timestampMs int64) time.Time {
	return time.Unix(timestampMs/1e3, timestampMs%1e3*1e6)
}

func GetTimeStamp(t time.Time) int64 {
	if year := t.Year(); year >= maxYear || year < minYear {
		return t.Unix() * 1e3
	}
	return t.UnixNano() / 1e6
}

func formatMonthAndDay(input int64) string {
	ret := ConvertIntToString(input)
	if len(ret) == 1 {
		return "0" + ret
	}
	return ret
}

func getLastDayOfMonth(year int64, month int64) int64 {
	if month == 2 {
		if isLeapYear(year) {
			return 29
		} else {
			return 28
		}
	}

	if month == 4 || month == 6 || month == 9 || month == 11 {
		return 30
	}
	return 31
}


func GetExpireTime(startTime time.Time, month int64) time.Time {
	if month <= 0 {
		return startTime
	}

	minuteTime := startTime.String()[10:19]
	nowY, nowM, nowD := startTime.Date()

	expireYear := int64(nowY)
	expireMonth := int64(nowM) + month
	expireDay := int64(nowD)

	// 处理月份
	for expireMonth > 12 {
		expireMonth = expireMonth - 12
		expireYear = expireYear + 1
	}

	// 处理天
	if expireDay > 1 && expireDay <= 29 {
		expireDay = expireDay - 1
	} else if expireDay > 29 {
 		// 如果是2月需要判断天数
		if expireMonth == 2 {
			expireDay = getLastDayOfMonth(expireYear, expireMonth)
		} else {
			expireDay = expireDay - 1
		}
	} else if expireDay == 1 {
		if expireMonth > 1 {
			expireMonth = expireMonth - 1
			expireDay = getLastDayOfMonth(expireYear, expireMonth)
		} else {  // 某年1月1日
			expireYear = expireYear - 1
			expireMonth = 12
			expireDay = 31
		}
	}

	expireTimeS := ConvertIntToString(expireYear) + "-" + formatMonthAndDay(expireMonth) + "-" + formatMonthAndDay(expireDay) + minuteTime

	expireTime, _ := time.ParseInLocation("2006-01-02 15:04:05", expireTimeS, time.Local)

	return expireTime
}


func main() {
	s := "2020-12-01 11:44:05"
	month := int64(1)
	startTime, _ := time.ParseInLocation("2006-01-02 15:04:05", s, time.Local)
	ret := GetExpireTime(startTime, month)
	print(GetTimeStamp(ret))
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值