首页 > 解决方案 > Applescript:通过添加具有奇怪行为的天数来增加月份

问题描述

所以我试图定义一个增加月份的函数。但已经在开始时,我偶然发现了以下问题。

set testdate to (current date)
set the month of testdate to (1 as integer)
set the day of testdate to (1 as integer)

tell testdate to set {day} to {day + 32 * 4}
testdate

我希望至少能得到 2020 年 5 月的某个日期的输出(当然不是 5 月 1 日,而是开始时的某个日期),但是,输出是

date "Montag, 26. August 2019 um 15:53:13"

反而。有人可以向我解释一下吗?

例如,如果我将上面的“4”更改为“3”,那么我会得到预期的结果

date "Montag, 6. April 2020 um 16:06:21"

在 red_menace 的帮助下,我能够实现以下增加几个月的过程。

on addMonths onto oldDate by m
    copy oldDate to newDate
    set newDate to newDate + (days * 31 * m)
    if newDate's day is not oldDate's day then set newDate to (newDate) - ((newDate's day) - (oldDate's day)) * days
    return newDate
end addMonths

(但是,仍然没有解释为什么会发生此错误。)

标签: dateapplescriptoffset

解决方案


我不认为这是一个错误,因为它可能是日期对象在内部实现方式的结果(我的猜测是 127 有效,但 128 无效)。该day属性适用于一个月中的某一天 (1 - 31),因此通过使用越界天数作弊可能会在几天内溢出到附近的月份,但他们可能不会费心检查超出大小的东西分配的结构。

处理日期时,时差的正常过程是增加或减少秒数。date 类具有各种属性,例如dayand month,但也有常量daysor hours,它们分别包含一天或一小时的秒数(它们只转到weeks,因为月份没有固定的天数):

set testdate to (current date) -- get a date object
set the month of testdate to 1 -- set new month
set the day of testdate to 1 -- set new day

log 24 * hours
log days
return testdate + (days * 32 * 4) -- add to the date

请参阅 AppleScript 语言指南中的日期类参考


推荐阅读