0 votos

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

Tengo un pedazo de AppleScript código que convierte una fecha numérica a la 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 a la palabra siguiente formato:

Sábado, 1 De Abril De 2017

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

Applescript fecha de manipulación para obtener múltiples formatos

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

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

Aquí está mi AppleScript código:

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)

Basado en algunos de depuración que he hecho, creo que el origen del problema se encuentra en esta línea:

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

Puede identificar y resolver el problema?


Me doy cuenta de que fácilmente se puede lograr el efecto deseado de determinar el nombre del mes por la aplicación de un if statement tales como:

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

Me refugiaba este método porque es largo y poco sofisticado.

También, me gustaría todavía tiene que averiguar el día de la semana, de alguna manera, lo que es más complicado y no se puede lograr con una simple if statement. Por lo tanto, la línea:

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

todavía sería de terminar mi código cuando theNumericalDate termina en _31.

1voto

Andreas Scherer Puntos 161

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

Explicación
Curiosamente, usted necesita para cambiar el mes antes del día, pero sólo si vas a cambiar el día 31 del mismo mes.

-v30d -v2m producirá de febrero de bien, pero el 31 del mes de causas date a fallos (hasta la versión que se incluye con macOS Sierra 10.12.4).

Usted puede cambiar el año en cualquier punto en el comando sin ningún problema.

Notas Al Margen

  1. set onlyTheDay to (onlyTheDay as integer) as string eliminará cualquier líder 0s de una cadena de números. Es menos propenso a errores de analizar una cadena. El rendimiento es insignificante en este caso.
  2. Usted tiene un espacio antes de date. No importa-sólo señalándolo.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X