/*
此DateCalc()函数通过以下方式计算任何StartDate的新日期
提供 "年"、"月 "和/或 "日"(+ 或-)作为参数。
https://jacks-autohotkey-blog.com/2021/04/01/calculating-dates-in-autohotkey-by-adding-years-months-and-or-days/

使用Floor()和Mod()函数来计算月份和年份。
https://jacks-autohotkey-blog.com/2021/04/12/fake-math-tricks-using-the-floor-and-mod-functions-autohotkey-tips/

2021年8月18日,当计算月份的天数少于起始月份时,添加了有效日期测试。
*/

; 对有效日期进行强制测试
起始日期 := 21000331
年 := 02
月 := 03
日 := 05

if 起始日期 is Date
  新的日期 := DateCalc(起始日期, 年, 月, 日)
 else {
  MsgBox, 不是一个有效的开始日期!
  Return
}

FormatTime, Start , %起始日期%, LongDate
FormatTime, New , %新的日期%, LongDate

MsgBox,, DateCalc, % Start "`r`r累加:`r`t年:" 年 "`r`t月:" 月 "`r`t日:" 日 "`r`r" New

DateCalc(Date="", Years=0, Months=0, Days=0) {
  If Date=
    Date := A_Now
  Months := SubStr(Date,5,2)+Months
    , CalcYears := Floor(Months/12) + Years
    , CalcMonths := Mod(Months,12)
  If (CalcMonths <= 0)
    CalcYears := CalcMonths = 0 ? CalcYears-1 : CalcYears
    , CalcMonths := CalcMonths + 12

  NewDate := Substr(Date,1,4)+CalcYears . Format("{:02}", CalcMonths) . Substr(Date,7,2)
/*
; Check for valid date
  FormatTime, TestDate, %NewDate%, ShortDate
  While !TestDate
  {
    NewDate := Substr(Date,1,4)+Years
    . Format("{:02}", Months)
    . Substr(Date,7,2)-A_Index
    
    FormatTime, TestDate, %NewDate%, ShortDate
  }
*/

; 检查三种可能的月份长度的有效日期
  Loop, 3 {
    if NewDate is not Date
      NewDate := Substr(Date,1,4)+Years . Format("{:02}", Months) . Substr(Date,7,2)-A_Index
    Else
      Break
  }

  NewDate += Days , Days
  Return NewDate
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。