Ho una data in questo formato: 12 May 2017 09:04:26
Voglio aggiornare automaticamente l'ora del mio Mac da questa stringa con una riga di comando.
Il primo modo che ho trovato è usare la riga di comando date
, come spiegato in Manpage data di Apple , il formato accettato è [[[mm]dd]HH]MM[[cc]yy][.ss]
(o {mese} {giorno} {ore} {minuti} {secolo} {anno}. {Secondi} ).
Il secondo modo che ho trovato è usare comando setsetup , con setdate
o settime
flags. I formati accettati sono: mm:dd:yy
(o {month}: {day}: {year} ) per setdate
e hh:mm:ss
(o {hour}: {minuti}: { secondi} ) per settime
.
Prima domanda: qual è la soluzione migliore per aggiornare il tempo?
E come posso convertire (con AppleScript o Bash Script o altro metodo) la prima stringa in un formato valido per date
o systemsetup
?
La manpage date
parla del comando strptime
ma non so come posso usarlo.
Aggiornamento (dopo la risposta @klanomath)
Ecco lo script che sto usando per aggiornare il mio orario di sistema quando è sbagliato (nel mio caso a volte la data risale al 2013). Lo script sta controllando alcuni server ntp con ntpdate
e sntp
comandi e se non funziona, prova a ottenere la data dell'intestazione http google.com per impostarla con date
e systemsetup
comandi.
#!/bin/bash
# Uncomment for debug
#set -x
# Check if bad year
is_2013() {
YEAR=$(sudo /usr/sbin/systemsetup -getdate | cut -d '/' -f 3)
if [ $YEAR == "2013" ]; then return 0; else return 1; fi
}
http_date_ud() {
# First method, update system time with "date" command
sudo date -f "%a, %d %b %Y %H:%M:%S %Z" "$1"
# Second method, update system time with "systemsetup" command
if is_2013 $1; then
NDATE=$(date -j -f "%a, %d %b %Y %H:%M:%S %Z" "$1" "+%m:%d:%y")
printf "$NDATE"
NTIME=$(echo "$1" | cut -d' ' -f5)
printf "$NTIME"
sudo /usr/sbin/systemsetup -setusingnetworktime off
sudo /usr/sbin/systemsetup -setdate $NDATE
sudo /usr/sbin/systemsetup -settime $NTIME
sudo /usr/sbin/systemsetup -setusingnetworktime on
fi
}
# 1°/ Trying with ntpdate on Apple + NTP global time servers
if is_2013 $1; then ntpdate -t 4 -u time.apple.com; else exit 0; fi
if is_2013 $1; then ntpdate -t 4 -u pool.ntp.org; else exit 0; fi
# 2°/ Trying with sntp with Apple + NTP local time servers
if is_2013 $1; then sntp -s time.euro.apple.com; else exit 0; fi
if is_2013 $1; then sntp -s fr.pool.ntp.org; else exit 0; fi
# 3°/ Trying with HTTP header
HTTP_DATE=$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f4-9)
lc_tmp=$LC_ALL && LC_ALL=C
http_date_ud "$HTTP_DATE"
LC_ALL=lc_tmp