Problem przy próbie przekonwertowania numeru miesiąca na słowo w AppleScript (ale tylko wtedy, gdy ten miesiąc zawiera 31 dni)

0

Mam fragment kodu AppleScript, który konwertuje datę liczbową na tę datę w słowach.

Kod akceptuje zmienną zawierającą datę w następującym formacie:

2017_04_01

Kod konwertuje tę datę numeryczną na następujący format oparty na słowach:

Sobota, 1 kwietnia 2017 r

Mój kod został zmodyfikowany w odpowiedzi na pytanie zadane przez użytkownika markhunte :

Manipulowanie datami jabłek w celu uzyskania wielu formatów

Mój kod działa doskonale, gdy jest podana dzisiejsza data 2017_04_01. Ale z jakiegoś powodu nie działa, gdy podano datę 31 dnia dowolnego miesiąca.

Na przykład mój kod nie zadziała, jeśli tak theNumericalDatejest 2017_03_31.

Oto mój kod 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)

W oparciu o pewne debugowanie, które zrobiłem, myślę, że źródłem problemu jest ta linia:

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

Czy możesz zidentyfikować i rozwiązać problem?


Zdaję sobie sprawę, że z łatwością mogę osiągnąć pożądany efekt określenia nazwy miesiąca poprzez wdrożenie if statementtakich jak:

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"
...

Odrzuciłem tę metodę, ponieważ jest długa i nieskomplikowana.

Nadal musiałbym jakoś wymyślić dzień tygodnia, który jest bardziej skomplikowany i nie może być zrealizowany prostym if statement. Tak więc linia:

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

nadal kończyłby mój kod, gdy theNumericalDateskończy się _31.

sfera rubika
źródło

Odpowiedzi:

1

Rozwiązanie
Użyj następującego stringForShellScript :
"date -v" & onlyTheMonth & "m -v" & onlyTheDay & "d -v" & onlyTheYear & "y +%"

Wyjaśnienie
Co ciekawe, musisz przesunąć miesiąc przed dniem, ale tylko jeśli zamierzasz przesunąć dzień do 31 dnia miesiąca.

-v30d -v2mbędzie dobrze produkować luty , ale 31-go miesiąca powoduje datebłąd (do wersji dostarczanej z macOS Sierra 10.12.4).

Możesz przesunąć rok w dowolnym punkcie polecenia bez żadnego problemu.

Uwagi dodatkowe

  1. set onlyTheDay to (onlyTheDay as integer) as stringusunie wszystkie wiodące 0 z ciągu liczb. Jest mniej podatny na błędy niż parsowanie łańcucha. Wydajność jest w tym przypadku nieistotna.
  2. Masz przed sobą wiodącą przestrzeń date. Nie, żeby to miało znaczenie - tylko wskazanie.

źródło