Problem beim Versuch, die Monatszahl in AppleScript in die Wortform umzuwandeln (jedoch nur, wenn dieser Monat 31 Tage enthält)

Ich habe einen AppleScript-Code, der ein numerisches Datum in dieses Datum in Worten umwandelt.

Der Code akzeptiert eine Variable, die ein Datum im folgenden Format enthält:

01.04.2017

Der Code konvertiert dieses numerische Datum in das folgende wortbasierte Format:

Samstag, 1. April 2017

Mein Code wurde von der Antwort auf diese Frage von Benutzer markhunte geändert :

Applescript-Datumsmanipulation, um mehrere Formate zu erhalten

Mein Code funktioniert perfekt, wenn er das heutige Datum von 2017_04_01. Aber aus irgendeinem Grund funktioniert es nicht, wenn das Datum des 31. Tages eines bestimmten Monats angegeben wird.

Mein Code funktioniert beispielsweise nicht, theNumericalDatewenn 2017_03_31.

Hier ist mein AppleScript-Code:

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)

Basierend auf einigem Debugging, das ich durchgeführt habe, denke ich, dass die Ursache des Problems in dieser Zeile liegt:

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

Können Sie das Problem identifizieren und lösen?


Mir ist klar, dass ich den gewünschten Effekt der Bestimmung des Monatsnamens leicht erreichen kann, indem ich Folgendes implementiere 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"
...

Ich habe mich vor dieser Methode gescheut, weil sie langwierig und anspruchslos ist.

Außerdem müsste ich noch irgendwie den Wochentag herausfinden, was komplizierter ist und nicht mit einem einfachen erreicht werden kann if statement. Also die Zeile:

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

würde meinen Code immer noch beenden, wenn theNumericalDateer auf endet _31.

Antworten (1)

Lösung
Verwenden Sie das folgende stringForShellScript :
"date -v" & onlyTheMonth & "m -v" & onlyTheDay & "d -v" & onlyTheYear & "y +%"

Erläuterung
Interessanterweise müssen Sie den Monat vor den Tag verschieben, aber nur, wenn Sie den Tag auf den 31. des Monats verschieben.

-v30d -v2mwird den Februar problemlos produzieren , aber der 31. des Monats verursacht dateeinen Fehler (bis zu der Version, die mit macOS Sierra 10.12.4 ausgeliefert wird).

Sie können das Jahr an jeder Stelle im Befehl ohne Probleme verschieben.

Randnotizen

  1. set onlyTheDay to (onlyTheDay as integer) as stringentfernt alle führenden Nullen aus einer Zahlenfolge. Es ist weniger fehleranfällig als das Analysieren einer Zeichenfolge. Die Leistung ist in diesem Fall unerheblich.
  2. Sie haben ein führendes Leerzeichen davor date. Nicht, dass es wichtig wäre – nur darauf hinweisen.