1 votes

Applescript : Chaîne à date

Je suis en train d'extraire différents formats de date d'une page web.

Par exemple : dimanche 10 septembre 2017 / 09/10/2017 / 10 septembre 2017.

dans l'exemple la date est la même, mais en direct, les dates sont complètement aléatoires et différentes. Cela pourrait être 01/2/1985 / November 10 novembre 2005

La première n'a pas trop d'importance car il s'agit de la date actuelle, que je génère moi-même et que je peux changer :

tell (current date)
    set strMonth to (its month as integer)
    set strDay to (its day as integer)
    set stryear to (its year as integer)
end tell

set myOwnDate to strMonth & "/" & strDay & "/" & stryear as string

Le format que je veux est un jour/mois/année entier, donc 10/09/2017.

Puis-je modifier les deux autres chaînes de caractères (09/10/2017 / 10 septembre 2017) dans ce format ?

0 votes

J'ai trouvé ce texte . Vous devriez être en mesure de le modifier pour l'adapter à vos besoins.

0 votes

Dans votre question : vous voulez day/month/year mais votre script renvoie un month/day/year chaîne.

3voto

Vous pouvez utiliser le NSDataDetector ( une méthode de cacao ) pour analyser la date à partir d'une chaîne de caractères.

Voici le script (testé sur MacOS Sierra ) :

Attention : sur une chaîne de caractères qui contient " chiffre/chiffre/année ", le script ne fonctionne pas avec une chaîne de caractères dans le champ " jour/mois/année "la chaîne doit être dans le format " mois/jour/année "Format

use framework "Foundation"
use scripting additions

(* this script works on these formats: 
"Sunday 10th September 2017", "Sunday 10 September 2017", "Sunday 10 September 17", "September 10th, 2017", "September 10th 2017", "September 10 2017"
 "10th September 2017", "10 September 2017", "10 Sep 17"
 also work with the abbreviation ( e.g. Sep instead of September and Sun instead of Sunday) 
 also work with the localized name of (the month and the day)

"09/10/2017", "09.10.2017", "09-10-2017" : month_day_year only,  or "2016/05/22", "2016-05-22", "2016.05.22" : year_month_day only 
( month and days could be one or two digits)
*)

set myString to "Nov 5th, 2005"
set dateString to my stringToDate(myString) --> "05/11/2005"

on stringToDate(thisString) -- 
    tell current application
        -- **  finds all the matches for a date, the result is a NSArray ** 
        set m to its ((NSDataDetector's dataDetectorWithTypes:(its NSTextCheckingTypeDate) |error|:(missing value))'s matchesInString:thisString options:0 range:{0, length of thisString})
        if (count m) > 0 then
            set d to (item 1 of m)'s |date|() -- get the NSDate of the first item 
            set df to its NSDateFormatter's new() -- create a NSDateFormatter 
            df's setDateFormat:"dd/MM/yyyy" -- a specified output format: "day/month/year" (day and month = two digits, year = 4 digits)
            return (df's stringFromDate:d) as text
        end if
    end tell
    return "" -- no match in this string
end stringToDate

2 votes

Je peux me tromper, mais je vois un problème ici. Si, par exemple, la date extraite de la page Web est une chaîne au format de 09/10/2016 Cela pourrait être le 10 septembre 2016 ou le 9 octobre 2016, selon les États-Unis qui utilisent le système d'échange de quotas. MDY ou de nombreux autres endroits qui utilisent DMY et en soi, sans autre contexte, je ne pense pas qu'il y ait un moyen de déterminer de laquelle il s'agit réellement. Par conséquent, si je passe 09/10/2016 à votre gestionnaire, il renvoie "10/09/2016" Dans ce cas, pourriez-vous nous expliquer comment on peut savoir si cette chaîne de caractères existe ou non sans aucune autre référence, 09/10/2016 qui a commencé comme MDY ou DMY ?

1 votes

Exact, il est impossible de savoir pour une chaîne de type " chiffre/chiffre/année ", pour ce type, mon script supposera qu'il contient une MDY date. Aucun script ou code ne peut la trouver. Seul l'utilisateur saura que, sur une page web, les dates seront dans le format D/M/Y ou M/D/Y Ainsi, pour certaines pages, le script n'aura besoin d'aucune fonction puisque la chaîne (date) est déjà au bon format.

2voto

mpgchgo Points 21

Votre script ne retournera probablement pas une date...

set myOwnDate to date (myOwnDate)

Ça ne marchera pas...

... mais vous pouvez le convertir en date lorsque vous l'appliquez à la propriété d'un élément dont le format est une date. Par exemple :

    set myOwnDate to "10/09/2017" as string
    set dt to path to desktop
    tell application "Finder"
      set the modification date of (alias (dt & "myFile.txt" as string)) to (date myOwnDate) 
    end tell

Cela a marché pour moi.

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