Applescript: String to Date

1

Saya mengekstraksi berbagai format tanggal dari halaman web.

Misalnya. Minggu 10 September 2017 / 09/10/2017 / 10 September 2017.

pada contoh tanggalnya sama, tetapi dalam siaran langsung, tanggalnya adalah   benar-benar acak dan berbeda. Ini bisa 01/2/1985 / November   10, 2005

Yang pertama tidak terlalu penting karena ini adalah tanggal saat ini, yang saya hasilkan sendiri dan saya dapat mengubahnya:

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 yang saya inginkan adalah bilangan bulat hari / bulan / tahun jadi 10/09/2017.

Bisakah saya mengubah dua string lainnya (09/10/2017 / 10 September 2017) ke format ini?

Kevin
sumber
Saya menemukan inti ini . Anda harus dapat memodifikasi ini agar sesuai dengan kebutuhan Anda.
Joonas
Dalam pertanyaan Anda: Anda inginkan day/month/year, tetapi skrip Anda mengembalikan a month/day/year tali.
jackjr300

Jawaban:

2

Anda dapat menggunakan NSDataDetector ( metode kakao ) untuk penguraian tanggal dari sebuah string.

Inilah skripnya (diuji pada macOS Sierra ):

Peringatan: pada string yang berisi " digit / digit / tahun ", skrip tidak berfungsi dengan string di" hari bulan tahun "format, string harus dalam" bulan hari Tahun "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
jackjr300
sumber
2
Namun saya bisa saja salah, saya melihat ada masalah di sini. Jika, misalnya, tanggal yang diekstraksi dari halaman web adalah string dalam format 09/10/2016, dapat berupa 10 September 2016 atau 09 Oktober 2016 bergantung pada AS yang menggunakannya MDY atau banyak tempat lain yang digunakan DMY, dan dengan sendirinya tanpa konteks lain saya tidak percaya ada cara untuk menentukan mana yang sebenarnya. Karena itu, jika saya lulus 09/10/2016 ke pawang Anda, ia kembali "10/09/2016", jadi, bisakah Anda menjelaskan bagaimana orang tahu apakah string ini atau tidak tanpa referensi lain, 09/10/2016, dimulai sebagai MDY atau DMY?
user3439894
1
Benar, Tidak mungkin untuk mengetahui untaian tipe " digit / digit / tahun ", untuk jenis ini, skrip saya akan menganggap bahwa itu berisi a MDY tanggal. Tidak ada skrip atau kode yang dapat menemukannya. Hanya pengguna yang akan tahu bahwa pada beberapa halaman web, tanggalnya akan ada di D / M / Y format atau M / D / Y , jadi untuk beberapa halaman, skrip tidak akan memerlukan fungsi apa pun karena string (tanggal) sudah dalam format yang benar
jackjr300