Cálculo de fechas 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 fin de cualquier semana.

El resultado debería verse así:

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

Dónde weeknumber Se sustituye por un número de semanas de la semana. day1, month1 y year1 tomar weeknumber S 'número de semana y lo analiza a la fecha de esos días. Así que para la semana número 09 en 2016 eso sería 29. 02. 2016. La primera semana termina ( day2 y así sucesivamente) 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 la cáscara es posible obtener el último día de un mes al igual que:

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

En AppleScript puede activar cualquier cadena, por ejemplo. devuelto desde un script de shell ( date ) en 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.

Zettt
fuente

Respuestas:

2

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

Puedes decir date simplemente "ir 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. Este 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 que +'string' al final lo hace, es el formato de la fecha en que se encuentra en la forma en que desea que se muestre. Utilizo esto en mi script para hacer una cadena de fecha que AppleScript date el comando entiende. Por favor no confundas el comando shell date(1) con el AppleScript date mando.

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 AppleScript set var to date "date-string" Tienes que darle una cadena en tu localidad. En Europa la cuerda es 01. 02. 2016 23:59:59. En América, esto es probablemente algo como 2016/02/01 23:59:59. Es necesario modificar estos en las variables en el script. ( +'%Y/%m/%d' al final)

Zettt
fuente
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 como 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
Ryan M
fuente
¡Gracias por la ayuda, Ryan! Eso no respondió a mi pregunta, pero me dio un empujón en la dirección correcta. Voy a publicar mi respuesta cuando termine el guión.
Zettt