Apple Script: no se puede obtener la fecha de "2018-12-12 10:00 10:00”

2

Finalidad del script La siguiente secuencia de comandos utiliza una aplicación llamada Pashua para mostrar un cuadro de diálogo personalizado que devuelve múltiples entradas. Estas entradas se utilizan para crear un nuevo evento de calendario.

ElproblemaElproblemaqueestoyexperimentandoesquelafechasedevuelveenelformatoAAAA-MM-DD.CuandolafechaseingresaenformatoMM/DD/YYYY,eleventosecreasinproblemas.

¿Cómoconviertolafechacorrectamente?

Estassonlaslíneasdecódigoquenecesitanayuda:

setsDateto(sDateoftheResult)---Returns:2018-12-12setsTimeto(sTimeoftheResult)---Returns:10:00AMseteDateto(eDateoftheResult)---Returns:2018-12-12seteTimeto(eTimeoftheResult)---Returns:11:00AMseteStarttodateof(sDate&space&sTime)---Error:Can’tgetdateof2018-12-1210:00AMseteEndtodateof(eDate&space&eTime)---Error:Can’tgetdateof2018-12-1211:00AM

Esteeselerrorqueaparece:

Códigocompleto:

--Getthepathtothefoldercontainingthisscripttellapplication"Finder"
set thisFolder to (container of (path to me)) as string
if "Pashua:Pashua.app:" exists then
    -- Looks like the Pashua disk image is mounted. Run from there.
    set customLocation to "⁨/Users/dnaab/Applications/"
else
    -- Search for Pashua in the standard locations
    set customLocation to "/Users/dnaab/Applications/"
end if
 end tell

 try
    set thePath to alias (thisFolder & "Pashua.scpt")
    set pashuaBinding to load script thePath

tell pashuaBinding
    -- Display the dialog

    try
        set pashuaLocation to getPashuaPath(customLocation)
        set dialogConfiguration to my getDialogConfiguration(pashuaLocation)
        set theResult to showDialog(dialogConfiguration, customLocation)

        -- Display the result. The record keys ("... of theResult") are defined in the
        -- dialog configuration string.
        if {} = theResult then
            display alert "Empty return value" message "It looks like Pashua had some problems using the window configuration." as warning
        else if cb of theResult is not "1" then

            set eCalendar to "Calendar"

            set eSummary to (eSummary of theResult)

            set eURL to (eURL of theResult)

            set eDescription to (eDescription of theResult)

            set sDate to (sDate of theResult)

            set sTime to (sTime of theResult)

            set eDate to (eDate of theResult)

            set eTime to (eTime of theResult)

            set sDate to date of (sDate & space & sTime)

            set eDate to date of (eDate & space & eTime)




            display dialog sDate buttons {"Cancel"} default button 1




            tell application "Calendar"
                tell calendar eCalendar
                    make new event with properties {summary:eSummary, start date:eStart, end date:eDate, url:eURL}
                end tell
            end tell
        else
            -- The cancelbutton (named "cb" in the config string) was pressed

            (*
            display dialog "The dialog was closed without submitting the values"
            *)

        end if
    on error errorMessage
        display alert "An error occurred" message errorMessage as warning
    end try
end tell

 on error errStr number errorNumber
display dialog errStr
 end try


 -- Returns the configuration string for an example dialog
 on getDialogConfiguration(pashuaLocation)

if pashuaLocation is not "" then
    set img to "img.type = image
          img.x = 250
          img.y = 260
          img.maxwidth = 60
          img.tooltip = This is an element of type “image”
          img.path = /Applications/Calendar.app/Contents/Resources/App.icns"
else
    set img to ""
end if

return "

 # Set window title
 *.title = New iCal Event

 # Event Summary
 eSummary.type = textfield
 eSummary.label = Event Summary
 eSummary.default = Calendar
 eSummary.width = 310
 eSummary.x = 1
 eSummary.y = 310

 # Add Start Date
 sDate.type = date
 sDate.label = Event Start Date
 sDate.default = today
 sDate.textual = 1
 sDate.x = 1
 sDate.y = 255

 # Add Start Time
 sTime.type = date
 sTime.label = Event Start Time
 sTime.default = today
 sTime.time = 1
 sTime.date = 0
 sTime.textual = 1
 sTime.width =70
 sTime.x = 110
 sTime.y = 255

 # Add End Date
 eDate.type = date
 eDate.label = Event Start Date
 eDate.default = today
 eDate.textual = 1
 eDate.x = 1
 eDate.y = 200

 # Add End Time
 eTime.type = textfield
 eTime.label = Event End Time
 eTime.width = 70
 eTime.x = 110
 eTime.y = 200

 # Add Calendar
 eURL.type = textfield
 eURL.label = URL
 eURL.default = message://
 eURL.width = 310
 eURL.x = 1
 eURL.y = 150

 # Description
 eDescription.type = textbox
 eDescription.label = Description
 eDescription.width = 310
 eDescription.x = 1
 eDescription.y =70

 # Add a cancel button with default label
 db.type = defaultbutton
 cb.type = cancelbutton
 "
 end getDialogConfiguration
    
pregunta David Naab 13.12.2018 - 03:13

1 respuesta

0

Las fechas de AppleScript son notoriamente exigentes con el formato. Siguen su ejemplo de su propia fecha del sistema y amp; configuración de la hora, incluso si tengo un script que funcione correctamente en mi sistema utilizando una fecha específica & formato de hora, probablemente no funcionará en su sistema a menos que tenga la misma configuración de macOS.

Por lo tanto, la mejor manera de lidiar con los objetos de fecha AppleScript es crearlos desde cero utilizando los componentes de día, mes, año y hora. De esa manera, funcionan de forma coherente en todos los sistemas, pero, lo que es más importante, le permiten manipularlos en su propio script sin errores inesperados.

Agregue el siguiente controlador a la parte inferior de su script. Le brindará los medios para crear un objeto de fecha AppleScript proporcionándole el día, mes y año, y (opcionalmente) la hora, los minutos y los segundos componentes:

to makeASDate given year:y as integer ¬
    , month:m ¬
    , day:d as integer ¬
    , hours:h as integer : 0 ¬
    , minutes:min as integer : 0 ¬
    , seconds:s as integer : 0
    local y, m, d, h, min, s

    tell the (current date) to set ¬
        [ASDate, year, its month, day, time] to ¬
        [it, y, m, d, h * hours + min * minutes + s]

    ASDate
end makeASDate

Para usarlo, simplemente llame al controlador así:

makeASDate given year:2018, month:January, day:23
    --> date "Tuesday, 23 January 2018 at 00:00:00"

o

makeASDate given year:2018, month:1, day:23, hours:14, minutes:30, seconds:00
    --> date "Tuesday, 23 January 2018 at 14:30:00"

Ahora, su próxima tarea es extraer los componentes de año, mes a día de sus variables para pasarlos al controlador makeASDate . La forma más fácil de hacerlo es dividir las variables de fecha / hora en palabras. Por ejemplo, con su fecha y hora de inicio:

set [sy, sm, sd] to words of (sDate of theResult)
    --> {"2018", "12", "12"}

set [sh, smin, AMPM] to words of (sTime of theResult)
    --> {"10", "00", "AM"}
if AMPM = "PM" then set sh to sh + 12

y de manera similar con sus tiempos finales. He ilustrado una prueba rápida con su variable de tiempo para determinar si es AM o PM, y cambié el valor del componente de hora en consecuencia (el controlador makeASDate usa el reloj de 24 horas). Tendrá que hacer otra prueba con su variable de fecha para determinar en qué formato se encuentra la fecha: dd/mm/yyyy o yyyy-mm-dd , que podría ser tan fácil como:

if (sDate of theResult) contains "-" then
    set [sy, sm, sd] to words of (sDate of theResult)
else if (sDate of theResult) contains "/" then
    set [sd, sm, sy] to words of (sDate of theResult)
end if
    
respondido por el CJK 15.12.2018 - 01:00

Lea otras preguntas en las etiquetas