Problema quando si tenta di convertire il numero del mese in formato word in AppleScript (ma solo quando quel mese contiene 31 giorni)

1

Ho un pezzo di codice AppleScript che converte una data numerica in quella data in parole.

Il codice accetta una variabile che contiene una data nel seguente formato:

2017_04_01

Il codice converte questa data numerica nel seguente formato basato su parole:

Saturday, April 1, 2017

Il mio codice è stato modificato dalla risposta fornita a questa domanda, dall'utente markhunte :

Manipolazione delle date di Applescript per ottenere più formati

Il mio codice funziona perfettamente quando viene indicata la data odierna di 2017_04_01 . Ma, per qualche ragione, non funziona quando viene data la data del giorno 31 di un dato mese.

Ad esempio, il mio codice non funzionerà se theNumericalDate è 2017_03_31 .

Ecco il mio codice 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)

Sulla base di alcuni debug che ho fatto, penso che la fonte del problema si trovi in questa linea:

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

Puoi identificare e risolvere il problema?

Mi rendo conto che posso facilmente ottenere l'effetto desiderato di determinare il nome del mese implementando un if statement come:

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

Ho evitato questo metodo perché è lungo e poco sofisticato.

Inoltre, dovrei ancora capire in qualche modo il giorno della settimana, che è più complicato e non può essere realizzato con un semplice if statement . Quindi, la linea:

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

terminerebbe ancora il mio codice quando theNumericalDate termina in _31 .

    
posta rubik's sphere 01.04.2017 - 23:28
fonte

1 risposta

2

Soluzione
Utilizza il seguente stringForShellScript :
"date -v" & onlyTheMonth & "m -v" & onlyTheDay & "d -v" & onlyTheYear & "y +%"

Spiegazione
È interessante notare che è necessario spostare il mese prima del giorno, ma solo se si sposta il giorno al 31 del mese.

-v30d -v2m produrrà febbraio bene, ma il 31st del mese fa sì che date esegua il bug out (fino alla versione fornita con macOS Sierra 10.12.4).

Puoi spostare l'anno in qualsiasi punto del comando senza alcun problema.

Note a margine

  1. set onlyTheDay to (onlyTheDay as integer) as string rimuoverà qualsiasi 0 iniziale da una stringa numerica. È meno soggetto a errori rispetto all'analisi di una stringa. La prestazione è irrilevante in questo caso.
  2. Hai uno spazio iniziale prima di date . Non che sia importante, basta indicarlo.
risposta data 02.04.2017 - 01:38
fonte

Leggi altre domande sui tag