0 votes

Problème lors de la conversion du numéro de mois en mot dans AppleScript (mais uniquement lorsque le mois contient 31 jours)

J'ai un morceau de code AppleScript qui convertit une date numérique en cette date en toutes lettres.

Le code accepte une variable qui contient une date au format suivant :

2017_04_01

Le code convertit cette date numérique dans le format de mots suivant :

Samedi 1er avril 2017

Mon code a été modifié à partir de la réponse fournie à cette question, par l'utilisateur markhunte :

Manipulation de la date en Applescript pour obtenir plusieurs formats

Mon code fonctionne parfaitement lorsqu'on lui donne la date du jour de 2017_04_01 . Mais, pour une raison quelconque, il ne fonctionne pas lorsqu'on lui donne la date du 31e jour d'un mois donné.

Par exemple, mon code ne fonctionnera pas si theNumericalDate est 2017_03_31 .

Voici mon code 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)

En me basant sur le débogage que j'ai effectué, je pense que la source du problème se trouve dans cette ligne :

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

Pouvez-vous identifier et résoudre le problème ?


Je me rends compte que je peux facilement obtenir l'effet désiré, à savoir déterminer le nom du mois, en implémentant une fonction if statement par exemple :

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

J'ai évité cette méthode parce qu'elle est longue et peu sophistiquée.

De plus, je devrais encore trouver le jour de la semaine, ce qui est plus compliqué et ne peut pas être réalisé par un simple if statement . Ainsi, la ligne :

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

mettrait quand même fin à mon code lorsque theNumericalDate se termine en _31 .

1voto

Solution
Utiliser les éléments suivants stringForShellScript :
"date -v" & onlyTheMonth & "m -v" & onlyTheDay & "d -v" & onlyTheYear & "y +%"

Explication
Il est intéressant de noter qu'il faut décaler le mois avant le jour, mais seulement si l'on veut décaler le jour au 31 du mois.

-v30d -v2m produira Février mais le 31 du mois entraîne une perte de temps. date (jusqu'à la version livrée avec MacOS Sierra 10.12.4).

Vous pouvez changer l'année à n'importe quel moment de la commande sans aucun problème.

Notes d'accompagnement

  1. set onlyTheDay to (onlyTheDay as integer) as string supprime tous les 0 en tête d'une chaîne de chiffres. Cette méthode est moins sujette aux erreurs que l'analyse d'une chaîne de caractères. La performance n'a pas d'importance dans ce cas.
  2. Vous avez un espace avant date . Cela n'a pas d'importance, je le signale simplement.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X