Cálculo de fecha en AppleScript. Números de semana y su fecha de inicio.

1

Quiero escribir un AppleScript que cree proyectos en OmniFocus donde la fecha de vencimiento y la fecha de vencimiento estén configuradas para el día de inicio y finalización de cualquier semana.

El resultado debería verse así:

weeknumber: day1. month1. year1 - day2. month2. year2

Donde weeknumber se reemplaza con un número de semanas de la semana. day1 , month1 y year1 toman weeknumber s 'número de semana y lo analizan a la fecha de esos días. Entonces, para la semana número 09 en 2016, sería 29. 02. 2016 . Los primeros fines de semana ( day2 , etc.) terminan en 06. 02. 2016 . Entonces, el resultado para la primera semana de 2016 se vería así:

09: 29. 02. 2016 - 06. 02. 2016

Desde el shell es posible obtener el último día de un mes así:

date -v 1d -v 3m -v 16y -v -1d +'%V: %d. %m. %Y'
09: 29. 02. 2016

En AppleScript puedes activar cualquier cadena, por ejemplo, devuelto desde un script de shell ( date ) a un objeto de fecha con la sintaxis:

set lastDayShell to do shell script "date -v 1d -v 3m -v 16y -v -1d +'%V: %d. %m. %Y'"
set lastDay to date lastDayShell

El comando para agregar un nuevo proyecto a OmniFocus es este:

tell application "OmniFocus"
    tell default document
        set weekNumbers to folder "Week Numbers"
        tell weekNumbers
            set project1 to make new project with properties {name:"09: 29. 02. 2016", defer date:firstDay, due date:lastDay, singleton action holder:true}
        end tell
    end tell
end tel

Sé todo eso. Simplemente no puedo encontrar un recurso que diga cómo obtener el primer y último día de cualquier semana. Quiero establecer la fecha de vencimiento del inicio de cualquier semana hasta el primer día de la semana y la fecha de vencimiento hasta el último día.

    
pregunta Zettt 28.12.2015 - 12:09

2 respuestas

2

Gracias al comentario de @ ryan-m encontré una solución. Resulta que date(1) es realmente genial. Su capacidad para hacer "ajustes" fue la respuesta.

Puede decirle a date que simplemente "vaya a" un día específico usando -v . Luego puede usar más y menos para "ajustar" esa fecha en otro -v . Así, por ejemplo:

date -v 1w -v 16y

Irá al primer mes de 2016. (O una fecha que contenga esa fecha)

Con un ajuste podemos recorrer las fechas:

date -v +1w -v +0d -v 16y
date -v +1w -v +6d -v 16y

Esto va a la primera semana de 2016. El segundo comando va desde el comienzo de esa primera semana con 6 días de antelación. Esto es el 10 de enero de 2016. -v +2w sería la segunda semana, y así sucesivamente. Es evidente que parte puede ser automatizada aquí.

Todo lo que hace +'string' al final es que formatea la fecha en la que se encuentra en la forma en que desea que se muestre. Utilizo esto en mi script para hacer una cadena de fecha que el comando date de AppleScript entiende. No confunda el comando de shell date(1) con el comando AppleScript date .

Este es el script con el que terminé, por cierto:

repeat with weekNumber from 1 to 52
    set weekStartShell to (do shell script "date -v +" & weekNumber & "w -v +0d -v 16y +'%d. %m. %Y'")
    set weekStart to date weekStartShell
    set weekEndShell to do shell script "date -v +" & weekNumber & "w -v +6d -v 16y +'%d. %m. %Y'"
    set weekEnd to date (weekEndShell & " 23:59:59")
    set projectName to (("CW" & weekNumber & ": " & weekStartShell & " - " & weekEndShell) as string)

    tell application "OmniFocus"
        tell folder "Day Projects" of default document
            set projectWeek to make new project with properties {name:projectName, defer date:weekStart, due date:weekEnd, singleton action holder:true}

        end tell
    end tell

end repeat

Tenga en cuenta que para utilizar set var to date "date-string" de AppleScript, debe asignarle una cadena en su ubicación. En Europa, la cadena es 01. 02. 2016 23:59:59 . En América, esto es probablemente algo así como 2016/02/01 23:59:59 . Es necesario modificar estos en las variables en el script. ( +'%Y/%m/%d' al final)

    
respondido por el Zettt 28.12.2015 - 19:58
0

Creo que esto debería conseguirte lo que deseas, asumiendo que deseas el primer sábado de un mes determinado.

Primero, comencemos con obtener su último día del mes con el script que usó, pero con salida en tiempo UNIX.

START=$(date -v 1d -v 3m -v 16y -v -1d +'%s') # given date in seconds

Ahora podemos encontrar el primer sábado del mes con esta fecha.

# parse the given date time
# move to the first of the month (-v1d)
# move to the 6th day of the week (-v6w)

date -v1d -v6w -jf '%s' $START '+ %a %d %b % Y'

# Result: Sat 06 Feb 2016
    
respondido por el Ryan M 28.12.2015 - 16:41

Lea otras preguntas en las etiquetas