Applescript: добавление месяцев путем добавления нескольких дней со странным поведением - PullRequest
0 голосов
/ 31 марта 2020

Итак, я пытаюсь определить функцию, которая добавляет месяцы. Но уже в начале я натыкаюсь на следующую проблему.

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 года (конечно, не первое мая, но что-то в начале ), однако, вместо этого получается

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

(Тем не менее, объяснение, почему эта ошибка все еще не существует.)

1 Ответ

1 голос
/ 02 апреля 2020

Я не думаю, что это ошибка настолько, насколько она может быть результатом того, как объект даты реализован внутри (я предполагаю, что 127 работает, а 128 нет). Свойство day предназначено для дня месяца (1 - 31), поэтому немного обманывать, используя недопустимые дни, может сработать из-за переполнения нескольких дней в ближайшие месяцы, но они, вероятно, не потрудились проверить что-то превышающее размер выделенной структуры.

При манипулировании датами обычной процедурой для разницы во времени является добавление или вычитание количества секунд. Класс даты имеет различные свойства, такие как day и month, но есть также такие константы, как days или hours, которые содержат количество секунд в дне или часе соответственно (они только go до 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...