Tengo una fecha en este formato: 12 May 2017 09:04:26
Quiero actualizar automáticamente la hora de mi Mac desde esta cadena con una línea de comandos.
La primera forma que encontré es usar la línea de comando date
, como se explica en página de manual de la fecha de Apple , el formato aceptado es [[[mm]dd]HH]MM[[cc]yy][.ss]
(o {month} {day} {hours} {minutes} {century} {year}. {Seconds} ).
La segunda forma que encontré es usar comando de configuración de sistema , con setdate
o settime
flags. Los formatos aceptados son: mm:dd:yy
(o {month}: {day}: {year} ) para setdate
y hh:mm:ss
(o {hour}: {minutes}: { segundos} ) para settime
.
Primera pregunta: ¿cuál es la mejor solución para actualizar el tiempo?
¿Y cómo puedo convertir (con AppleScript o Bash Script u otro método) la primera cadena a un formato válido para date
o systemsetup
?
La página de manual date
habla sobre el comando strptime
pero no sé cómo puedo usarlo.
Actualizar (después de la respuesta de @klanomath)
Aquí está el script que estoy usando para actualizar la hora de mi sistema cuando está mal (en mi caso, a veces la fecha se remonta a 2013). El script está revisando algunos servidores ntp con los comandos ntpdate
y sntp
y, si no funciona, intenta obtener la fecha del encabezado http de google.com para configurarlo con los comandos date
y systemsetup
.
#!/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