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, theNumericalDate
wenn 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 theNumericalDate
er auf endet _31
.
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 -v2m
wird den Februar problemlos produzieren , aber der 31. des Monats verursacht date
einen 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
set onlyTheDay to (onlyTheDay as integer) as string
entfernt alle führenden Nullen aus einer Zahlenfolge. Es ist weniger fehleranfällig als das Analysieren einer Zeichenfolge. Die Leistung ist in diesem Fall unerheblich.date
. Nicht, dass es wichtig wäre – nur darauf hinweisen.