比如说
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))
}