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 theNumericalDate
jest 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 statement
takich 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 theNumericalDate
skończy się _31
.
źródło