Tengo una fecha en este formato: 12 May 2017 09:04:26
Quiero auto-actualización de la hora de mi Mac de esta cadena con una línea de comandos.
La primera manera que he encontrado es usar date
de la línea de comandos, como se explica en la Manzana de la fecha manual, el formato aceptado es [[[mm]dd]HH]MM[[cc]yy][.ss]
(o {mes}{día}{horario}{minutos}{siglo}{año}.{segundos}).
La segunda manera que he encontrado es usar systemsetup comando, con setdate
o settime
banderas. Los formatos aceptados son: mm:dd:yy
(o {mes}:{día}:{año}) setdate
y hh:mm:ss
(o {hora}:{minutos}:{segundos}) settime
.
Primera pregunta: ¿cuál es la mejor solución a la hora de actualización?
Y ¿cómo puedo convertir (con AppleScript o Bash Script o cualquier otro método) la primera cadena a un formato válido para date
o systemsetup
?
El date
manual hablando de strptime
comando, pero no sé cómo puedo usarlo.
Actualización (después de @klanomath respuesta)
Aquí está el script que estoy usando para actualizar mi sistema de tiempo cuando es malo (en mi caso a veces la fecha de volver a 2013). Script de control de algunos servidores ntp con ntpdate
y sntp
comandos y si no funciona, tratando de obtener la fecha de google.com encabezado http para establecer con date
y systemsetup
comandos.
#!/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