AppleScript Date format and calculation

1

Lavoro con tre formati di data,

1. 18/04/2015 (PS la data del mio sistema non è la stessa ma GG / MM / AA)

2. 2 giugno 2012 ma convertiti nel 1 ° formato mediante il codice seguente

3. sabato 24 marzo 2018 (data corrente)

Ho appena creato lo script qui sotto per convertire entrambe le date nello stesso formato:

set creationDate to "March 23rd, 2018"
set CreationDay to ""
set Creationmonth to ""
set Creationyear to ""


if creationDate contains "1st" then
    set CreationDay to "1"
end if
if creationDate contains "2nd" then
    set CreationDay to "2"
end if
if creationDate contains "3rd" then
    set CreationDay to "3"
end if
if creationDate contains "4th" then
    set CreationDay to "4"
end if
if creationDate contains "5th" then
    set CreationDay to "5"
end if
if creationDate contains "6th" then
    set CreationDay to "6"
end if
if creationDate contains "7th" then
    set CreationDay to "7"
end if
if creationDate contains "8th" then
    set CreationDay to "8"
end if
if creationDate contains "9th" then
    set CreationDay to "9"
end if
if creationDate contains "10th" then
    set CreationDay to "10"
end if
if creationDate contains "11th" then
    set CreationDay to "11"
end if
if creationDate contains "12th" then
    set CreationDay to "12"
end if
if creationDate contains "13th" then
    set CreationDay to "13"
end if
if creationDate contains "14th" then
    set CreationDay to "14"
end if
if creationDate contains "15th" then
    set CreationDay to "15"
end if
if creationDate contains "16th" then
    set CreationDay to "16"
end if
if creationDate contains "17th" then
    set CreationDay to "17"
end if
if creationDate contains "18th" then
    set CreationDay to "18"
end if
if creationDate contains "19th" then
    set CreationDay to "19"
end if
if creationDate contains "20th" then
    set CreationDay to "20"
end if
if creationDate contains "21st" then
    set CreationDay to "21"
end if
if creationDate contains "22nd" then
    set CreationDay to "22"
end if
if creationDate contains "23rd" then
    set CreationDay to "23"
end if
if creationDate contains "24th" then
    set CreationDay to "24"
end if
if creationDate contains "25th" then
    set CreationDay to "25"
end if
if creationDate contains "26th" then
    set CreationDay to "26"
end if
if creationDate contains "27th" then
    set CreationDay to "27"
end if
if creationDate contains "28th" then
    set CreationDay to "28"
end if
if creationDate contains "29th" then
    set CreationDay to "29"
end if
if creationDate contains "30th" then
    set CreationDay to "30"
end if
if creationDate contains "31st" then
    set CreationDay to "31"
end if

if creationDate contains "2018" then
    set Creationyear to "2018"
end if
if creationDate contains "2017" then
    set Creationyear to "2017"
end if
if creationDate contains "2016" then
    set Creationyear to "2016"
end if
if creationDate contains "2015" then
    set Creationyear to "2015"
end if
if creationDate contains "2014" then
    set Creationyear to "2014"
end if
if creationDate contains "2013" then
    set Creationyear to "2013"
end if
if creationDate contains "2012" then
    set Creationyear to "2012"
end if
if creationDate contains "2011" then
    set Creationyear to "2011"
end if
if creationDate contains "2010" then
    set Creationyear to "2010"
end if
if creationDate contains "2009" then
    set Creationyear to "2009"
end if
if creationDate contains "2008" then
    set Creationyear to "2008"
end if
if creationDate contains "2007" then
    set Creationyear to "2007"
end if
if creationDate contains "2006" then
    set Creationyear to "2006"
end if
if creationDate contains "2005" then
    set Creationyear to "2005"
end if
if creationDate contains "2004" then
    set Creationyear to "2004"
end if
if creationDate contains "2003" then
    set Creationyear to "2003"
end if


if creationDate contains "January" then
    set Creationmonth to "01"
end if
if creationDate contains "February" then
    set Creationmonth to "02"
end if
if creationDate contains "March" then
    set Creationmonth to "03"
end if
if creationDate contains "April" then
    set Creationmonth to "04"
end if
if creationDate contains "May" then
    set Creationmonth to "05"
end if
if creationDate contains "June" then
    set Creationmonth to "06"
end if
if creationDate contains "July" then
    set Creationmonth to "07"
end if
if creationDate contains "Agust" then
    set Creationmonth to "08"
end if
if creationDate contains "September" then
    set Creationmonth to "09"
end if
if creationDate contains "October" then
    set Creationmonth to "10"
end if
if creationDate contains "November" then
    set Creationmonth to "11"
end if
if creationDate contains "December" then
    set Creationmonth to "12"
end if


set CreationfinalDate to CreationDay & "/" & Creationmonth & "/" & Creationyear
return CreationfinalDate

Domanda 1: Come posso convertire la data numero 3 (che è la data attuale) nello stesso formato

(So come restituire una stringa ma non altrimenti)

set myDate to date string of (current date)

Domanda 2: posso creare uno script per dirmi se la differenza tra la data 2 e la data 3 è entro 60 giorni o fuori da 60 giorni?

    
posta Kevin 24.03.2018 - 14:42
fonte

2 risposte

4

Domanda 1: Invece di risolvere il problema di ottenere current date solo per convertirlo in un altro formato, puoi ottenerlo immediatamente nel formato corretto con un comando bash:

    do shell script "date +'%m/%d/%Y'"
        --> 03/24/2018

Domanda 2: Innanzitutto, riformatta la data in quella che il tuo sistema può riconoscere. Nel tuo caso (e mio), è dd/mm/yyyy :

    set [M, ordinal, Y] to the words of "June 2nd, 2012"

    set the text item delimiters to {"st", "nd", "rd", "th"}
    set cardinal to (first text item of ordinal) --> "2"
    set cardinal to text -1 thru -2 of ("0" & cardinal) --> "02"

    set the text item delimiters to space
    set date_string to {M, cardinal, Y} as text

    -- date -j -f '%B %d %Y' 'June 02 2012' +'%d/%m/%Y'
    set command to {¬
        "date -j -f '%B %d %Y'", ¬
        quoted form of the date_string, ¬
        "+'%d/%m/%Y'"}

    do shell script (command as text) --> "02/06/2012"

Sottrarre una data dalla data corrente e dividere per days per ottenere il numero di giorni tra le due date:

    ((current date) - (date result)) / days
        --> 2121.627

PS. Puoi utilizzare lo stesso comando shell per convertire la data nel tuo primo formato, mm/dd/yyyy , semplicemente passando %d e %m alla fine del command stringa.

APPENDICE:

Ho pensato di mostrarti anche come convertire la terza stringa di data nel formato desiderato usando puro AppleScript. Può essere fatto piuttosto elegantemente, in realtà:

    set today to "Saturday 24 March 2018"

    set [_day, _month, _year] to [day, month, year] of date today
        --> {24, March, 2018}

    set _month to _month * 1 --> 3
    set _month to text -1 thru -2 of ("0" & _month) --> "03"

    set the text item delimiters to "/"
    return {_month, _day, _year} as string
        --> "03/24/2018"

Nota per altri utenti: il codice in questo addendum potrebbe o non potrebbe funzionare per te, a seconda delle impostazioni del tuo sistema. AppleScript è notoriamente pignolo su ciò che sarà e non riconoscerà come stringa di date. L'OP e io sembrano avere la Lingua & simile o identica; Impostazioni della data della regione , che consente alla variabile today di essere interpretata correttamente come una data da AppleScript, mentre lo stesso codice in esecuzione su un sistema diverso genera un errore.

Per adattare il codice qui per l'uso sul tuo sistema, prima esegui il comando get date string of (current date) per ottenere un'anteprima del formato data usato dal tuo sistema, quindi modifica la dichiarazione della variabile per today in modo che corrisponda. In alternativa, imposta la variabile today su the date string of (current date) .

    
risposta data 24.03.2018 - 16:06
fonte
0

Costruisci la tua data in un oggetto date AppleScript, quindi puoi eseguire calcoli come set myNewDate to myDate + (2 * days) . Per ulteriori calcoli sulla data, vedi Calcoli data / ora utilizzando AppleScript e Lingua AppleScript Guida - Data .

Di seguito è riportato un approccio alternativo all'analisi del terzo formato, più dettagliato, della data. Questo approccio utilizza sub-routine per dividere e tagliare l'input. Non è completo, ma si spera utile:

set myDate to "March 1st, 2018"
set myComponents to my split(myDate, " ")

set myDay to second item of myComponents
set myDay to trim(",rdsth", myDay) as integer

set myMonth to first item of myComponents
set myYear to last item of myComponents as integer

-- ...myDay, myMonth, and myYear are usable

-- http://erikslab.com/2007/08/31/applescript-how-to-split-a-string/
on split(theString, theDelimiter)
    -- save delimiters to restore old settings
    set oldDelimiters to AppleScript's text item delimiters
    -- set delimiters to delimiter to be used
    set AppleScript's text item delimiters to theDelimiter
    -- create the array
    set theArray to every text item of theString
    -- restore the old setting
    set AppleScript's text item delimiters to oldDelimiters
    -- return the result
    return theArray
end split

-- https://macscripter.net/viewtopic.php?id=18519
on trim(theseCharacters, someText)
    -- Lazy default (AppleScript doesn't support default values)
    if theseCharacters is true then set theseCharacters to ¬
        {" ", tab, ASCII character 10, return, ASCII character 0}

    repeat until first character of someText is not in theseCharacters
        set someText to text 2 thru -1 of someText
    end repeat

    repeat until last character of someText is not in theseCharacters
        set someText to text 1 thru -2 of someText
    end repeat

    return someText
end trim
    
risposta data 24.03.2018 - 15:39
fonte

Leggi altre domande sui tag