Calcolo della data in AppleScript. I numeri della settimana e la loro data di inizio

1

Desidero scrivere un AppleScript che crea progetti in OmniFocus, in cui la data e la data di scadenza del differimento sono impostate sul giorno di inizio e fine di ogni settimana.

Il risultato dovrebbe essere simile a questo:

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

Dove weeknumber viene sostituito con il numero di settimane di una settimana. day1 , month1 e year1 prendono weeknumber s 'il numero della settimana e lo analizza alla data di quel giorno. Quindi per la settimana numero 09 nel 2016 sarebbe 29. 02. 2016 . La fine della prima settimana ( day2 e così via) termina su 06. 02. 2016 . Quindi il risultato per la prima settimana del 2016 sarà simile a questo:

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

Dalla shell è possibile ottenere l'ultimo giorno di un mese così:

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

In AppleScript puoi trasformare qualsiasi stringa, ad es. restituito da uno script di shell ( date ) in un oggetto data con la sintassi:

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

Il comando per aggiungere un nuovo progetto a OmniFocus è questo:

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

So tutto questo. Non riesco a trovare una risorsa che dice come ottenere il primo e l'ultimo giorno di ogni settimana. Voglio impostare la data di differimento di ogni settimana dall'inizio alla prima della settimana e la data di scadenza dell'ultimo giorno.

    
posta Zettt 28.12.2015 - 12:09
fonte

2 risposte

2

Grazie al commento di @ ryan-m ho trovato una soluzione. Risulta che date(1) è in realtà davvero interessante. La sua capacità di fare "aggiustamenti" era la risposta.

Puoi dire date semplicemente a "andare a" un giorno specifico utilizzando -v . Puoi quindi utilizzare più e meno per "aggiustare" quella data in un altro -v . Quindi, ad esempio:

date -v 1w -v 16y

Andrà al primo mese del 2016. (O una data che contiene quella data)

Con una rettifica possiamo percorrere le date:

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

Questo va alla prima settimana del 2016. Il secondo comando va dall'inizio di quella prima settimana di 6 giorni prima. Questo è il 10 gennaio 2016. -v +2w sarebbe la seconda settimana, e così via. È evidente quale parte può essere automatizzata qui.

Tutto ciò che +'string' alla fine fa è formattare la data in cui ti trovi nel modo in cui vuoi che venga visualizzato. Lo uso nel mio script per creare una stringa di date che il comando date di AppleScript comprenda. Per favore non confondere il comando di shell date(1) con il comando AppleScript date .

Questo è lo script con cui ho finito, tra l'altro:

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

Nota che per usare set var to date "date-string" di AppleScript devi dargli una stringa nella tua locale. In Europa la stringa è 01. 02. 2016 23:59:59 . In America probabilmente è qualcosa come 2016/02/01 23:59:59 . È necessario modificarli nelle variabili nello script. ( +'%Y/%m/%d' alla fine)

    
risposta data 28.12.2015 - 19:58
fonte
0

Credo che questo dovrebbe farti ottenere quello che vuoi, supponendo che tu voglia il primo sabato di un determinato mese.

In primo luogo, iniziamo con il tuo ultimo giorno del mese con lo script che hai usato, ma in uscita come UNIX.

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

Ora possiamo trovare il primo sabato del mese con questa data.

# 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
    
risposta data 28.12.2015 - 16:41
fonte

Leggi altre domande sui tag