Formato y cálculo de fecha de AppleScript

1

Trabajo con formato de tres fechas,

1.04/18/2015 (PS la fecha de mi sistema no es la misma pero DD / MM / YY)

2. 2 de junio de 2012 pero convertido al primer formato con el siguiente código

3. sábado 24 de marzo de 2018 (fecha actual)

Acabo de crear el siguiente script para convertir ambas fechas en el mismo 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

Pregunta 1: ¿Cómo puedo convertir la fecha número 3 (que es la fecha actual) al mismo formato

(Sé cómo regresar como una cadena pero no de otra manera)

set myDate to date string of (current date)

Pregunta 2: ¿Puedo crear un script para decirme si la diferencia entre la fecha 2 y la fecha 3 es dentro de los 60 días o fuera de los 60 días?

    
pregunta Kevin 24.03.2018 - 14:42

2 respuestas

4

Pregunta 1: En lugar de pasar por la molestia de obtener current date solo para convertirlo a otro formato, puede obtenerlo en el formato correcto directamente con un comando bash:

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

Pregunta 2: Primero, vuelva a formatear la fecha en lo que su sistema pueda reconocer. En tu caso (y el mío), es 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"

Luego reste una fecha de la fecha actual, y divida por days para obtener el número de días entre las dos fechas:

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

PS. Puedes usar ese mismo comando de shell para convertir la fecha en tu primer formato, mm/dd/yyyy , simplemente cambiando %d y %m al final de command cadena.

ADDENDUM:

Pensé que también te mostraría cómo convertir la cadena de la tercera fecha al formato deseado usando AppleScript puro. Se puede hacer con bastante elegancia, en realidad:

    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 para otros usuarios: el código en este apéndice puede o no funcionar para usted, dependiendo de la configuración de su sistema. AppleScript es notoriamente inquieto acerca de lo que reconocerá y no reconocerá como una cadena de fecha. Parece que el OP y yo tenemos Language & La configuración de fecha de la Región , que permite que la variable today se interprete correctamente como una fecha por AppleScript, mientras que el mismo código que se ejecuta en un sistema diferente arrojaría un error.

Para adaptar el código aquí para usarlo en su propio sistema, primero ejecute el comando get date string of (current date) para obtener una vista previa del formato de fecha usado por su sistema, luego cambie la declaración de la variable para que coincida con today . Alternativamente, establezca la variable today en the date string of (current date) .

    
respondido por el CJK 24.03.2018 - 16:06
0

Coaccione su fecha en un objeto AppleScript date , luego puede realizar cálculos como set myNewDate to myDate + (2 * days) . Para obtener más cálculos de fechas, consulte Cálculos de fecha / hora con AppleScript y .

A continuación se muestra un enfoque alternativo para analizar el tercer formato de fecha, más detallado. Este enfoque utiliza sub-rutinas para dividir y recortar la entrada. No está completo, pero espero que sea útil:

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
    

Lea otras preguntas en las etiquetas