Проблема при спробі перетворити номер місяця на форму слова в AppleScript (але тільки тоді, коли цей місяць містить 31 день)


1

У мене є шматок коду AppleScript, який перетворює числову дату на цю дату словами.

Код приймає змінну, що містить дату в такому форматі:

2017_04_01

Код перетворює дану числову дату у наступний формат:

Субота, 1 квітня 2017 року

Мій код був змінений від відповіді, наданої користувачеві на це запитання markhunte :

Маніпуляція датою Applescript для отримання декількох форматів

Мій код працює відмінно, коли дано сьогоднішню дату 2017_04_01. Але, з якоїсь причини, вона не працює, коли їй дається дата 31 дня будь-якого даного місяця.

Наприклад, мій код не буде працювати, якщо theNumericalDate є 2017_03_31.

Ось мій код AppleScript:

set theNumericalDate to "2017_04_01"    

-- Remove the underscores:
set temp to AppleScript's text item delimiters
set AppleScript's text item delimiters to {"_"}
set listOfTheNumbersOfDate to text items of theNumericalDate
set AppleScript's text item delimiters to temp

-- Separate each individual element:    
set onlyTheYear to (item 1 of (listOfTheNumbersOfDate))
set onlyTheMonth to (item 2 of (listOfTheNumbersOfDate))
set onlyTheDay to (item 3 of (listOfTheNumbersOfDate))

-- I don't want to display "March 03" as the date. I would prefer: "March 3". So, remove the first character from the day if it is a zero:
if (character 1 of onlyTheDay is "0") then
    set onlyTheDay to text 2 thru -1 of onlyTheDay
end if

set stringForShellScript to " date -v" & onlyTheDay & "d -v" & onlyTheMonth & "m -v" & onlyTheYear & "y +%"

set theMonthAsWord to (do shell script (stringForShellScript & "B"))

set theDayAsWord to (do shell script (stringForShellScript & "A"))


set theDisplayDateString to (theDayAsWord & ", " & theMonthAsWord & " " & onlyTheDay & ", " & onlyTheYear)

Виходячи з деякої налагодження, яку я зробив, я вважаю, що джерело проблеми полягає в цьому рядку:

set theMonthAsWord to (do shell script (stringForShellScript & "B"))

Чи можна визначити та вирішити проблему?


Я розумію, що я можу легко виконати бажаний ефект визначення імені місяця, реалізуючи його if statement як от:

if onlyTheMonth is "01" then
    set theMonthAsWord to "January"
else if onlyTheMonth is "02" then
    set theMonthAsWord to "February"
else if onlyTheMonth is "03" then
    set theMonthAsWord to "March"
...

Я відхилявся від цього методу, тому що він тривалий і непростий.

Крім того, мені все одно доведеться якось розібратися в день тижня, який є більш складним і не може бути виконаний простою if statement. Таким чином, лінія:

set theDayAsWord to (do shell script (stringForShellScript & "A"))

все одно припинить мій код, коли theNumericalDate закінчується _31.

Відповіді:


2

Рішення
Використовуйте наступне stringForShellScript :
"date -v" & onlyTheMonth & "m -v" & onlyTheDay & "d -v" & onlyTheYear & "y +%"

Пояснення
Цікаво, що потрібно перенести місяць до дня, але тільки тоді, коли ви збираєтеся перенести день на 31-е число місяця.

-v30d -v2m буде виробляти Лютий просто добре, але 31-го числа місяця date помилка (до версії, що поставляється з macOS Sierra 10.12.4).

Ви можете перенести рік у будь-якій точці команди без будь-яких проблем.

Бічні ноти

  1. set onlyTheDay to (onlyTheDay as integer) as string видаляє будь-які провідні 0s з рядка чисел. Це менш схильні до помилок, ніж аналіз рядка. Продуктивність в цьому випадку несуттєва.
  2. У вас є провідний простір раніше date. Не те, що це важливо - просто вказуючи.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.