Jabłko: Ciąg do daty

1

Wyodrębniam różne formaty dat ze strony internetowej.

Np. Niedziela 10 września 2017 r. / 09/10/2017 / 10 września 2017 r.

w tym przykładzie data jest taka sama, ale na żywo daty są całkowicie losowe i różne. Może to być 01/2/1985 / 10 listopada 2005

Pierwszy nie ma większego znaczenia, ponieważ jest to bieżąca data, którą sam generuję i mogę ją zmienić:

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

Format, którego chcę, to liczba całkowita dzień / miesiąc / rok, więc 10/09/2017.

Czy mogę zmienić dwa pozostałe ciągi (09/10/2017 / 10 września 2017 r.) Na ten format?

Kevin
źródło
Znalazłem tę istotę . Powinieneś być w stanie to zmienić, aby dopasować do swoich potrzeb.
Joonas,
W twoim pytaniu: chcesz day/month/year, ale twój skrypt zwraca month/day/yearciąg.
jackjr300,

Odpowiedzi:

2

Możesz użyć NSDataDetector ( metoda kakao ) do parsowania daty z łańcucha.

Oto skrypt (testowany na macOS Sierra ):

Ostrzeżenie: w łańcuchu zawierającym „ cyfra / cyfra / rok ” skrypt nie działa z łańcuchem w formacie „ dzień / miesiąc / rok ”, łańcuch musi być w formacie „ miesiąc / dzień / rok

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
jackjr300
źródło
2
Mogę się mylić, jednak widzę tutaj problem. Jeśli na przykład wyodrębniona data ze strony ma ciąg znaków w formacie 09/10/2016, czy może to być albo 10 września 2016 r., Albo 9 października 2016 r., W zależności od Stanów Zjednoczonych, które korzystają, MDYlub wielu innych miejsc, które korzystają DMY, i same w sobie bez innego kontekstu I nie wierzcie, że istnieje sposób, aby ustalić, który to rzeczywiście jest. Dlatego, jeśli przekażę 09/10/2016twój moduł obsługi, zwraca "10/09/2016", więc czy mógłbyś wyjaśnić, skąd można wiedzieć, czy ten ciąg bez innych odniesień 09/10/2016, rozpoczęty jako MDYlub DMY?
user3439894
1
Racja, nie można znać ciągu typu „ cyfra / cyfra / rok ”, dla tego typu mój skrypt zakłada, że ​​zawiera datę MDY . Żaden skrypt ani kod nie może go znaleźć. Tylko użytkownik będzie wiedział, że na niektórych stronach internetowych daty będą w formacie D / M / Y lub M / D / Y , więc dla niektórych stron skrypt nie będzie potrzebował żadnej funkcji, ponieważ ciąg (data) jest już we właściwym formacie
jackjr300,