Problema al intentar convertir el número del mes en forma de palabra en AppleScript (pero solo cuando ese mes contiene 31 días)

Tengo un fragmento de código AppleScript que convierte una fecha numérica en esa fecha en palabras.

El código acepta una variable que contiene una fecha en el siguiente formato:

2017_04_01

El código convierte esta fecha numérica al siguiente formato basado en palabras:

sábado, 1 de abril de 2017

Mi código ha sido modificado a partir de la respuesta proporcionada a esta pregunta por el usuario markhunte :

Manipulación de fecha de Applescript para obtener múltiples formatos.

Mi código funciona perfectamente cuando se le da la fecha de hoy de 2017_04_01. Pero, por alguna razón, no funciona cuando se le da la fecha del día 31 de cualquier mes dado.

Por ejemplo, mi código no funcionará si theNumericalDatees 2017_03_31.

Aquí está mi código 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)

Según algunas depuraciones que he realizado, creo que el origen del problema se encuentra en esta línea:

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

¿Puedes identificar y resolver el problema?


Me doy cuenta de que puedo lograr fácilmente el efecto deseado de determinar el nombre del mes implementando algo if statementcomo:

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

Rechacé este método porque es largo y poco sofisticado.

Además, todavía tendría que averiguar el día de la semana de alguna manera, lo cual es más complicado y no se puede lograr con un simple if statement. Así, la línea:

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

aún terminaría mi código cuando theNumericalDatetermine en _31.

Respuestas (1)

Solución
Utilice el siguiente stringForShellScript :
"date -v" & onlyTheMonth & "m -v" & onlyTheDay & "d -v" & onlyTheYear & "y +%"

Explicación
Curiosamente, debe cambiar el mes anterior al día, pero solo si va a cambiar el día al 31 del mes.

-v30d -v2mproducirá febrero bien, pero el 31 del mes causará dateun error (hasta la versión que se envía con macOS Sierra 10.12.4).

Puede cambiar el año en cualquier punto del comando sin ningún problema.

Notas al margen

  1. set onlyTheDay to (onlyTheDay as integer) as stringeliminará cualquier 0 inicial de una cadena de números. Es menos propenso a errores que analizar una cadena. El rendimiento es intrascendente en este caso.
  2. Tienes un espacio principal antes date. No es que importe, solo señalarlo.