Convertir una cadena de fecha para el comando date o systemsetup

0

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
    
pregunta Klemart3D 12.05.2017 - 12:13

1 respuesta

3

Para establecer correctamente una fecha y hora más o menos actual del sistema con date y wget use:

sudo date -f "%d %b %Y %H:%M:%S %Z" "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-9)"

El uso de ... cut -d' ' -f5-8)" (vea su comentario) omitirá la zona horaria y tendrá que agregar 1 o 2 horas, dependiendo del estado del horario de ahorro de luz del día para ajustar su hora local.

El resultado de wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-9 es algo como 12 de mayo de 2017 12:17:00 GMT .

Por lo tanto, el formato de fecha / hora del comando de fecha para establecer la fecha / hora debe ser %d %b %Y %H:%M:%S %Z . Ya que mayo es el corto así como el nombre largo del mes y no sabemos realmente el formato del nombre del mes en la respuesta de Google,% b puede ser reemplazado por% B en junio :-).

Debido a la retención y otras deficiencias, esto no es muy preciso y el ∂ es de hasta 3.5 segundos (generalmente de 0.32 segundos aquí) en comparación con el tiempo recibido a través de ntp.

Para deshacerte del error sntp mencionado en tu comentario, haz lo siguiente:

sudo touch /var/db/ntp-kod
sudo chmod 666 /var/db/ntp-kod

Ahora deberían funcionar sntp fr.pool.ntp.org y sudo sntp -s fr.pool.ntp.org .

    
respondido por el klanomath 12.05.2017 - 14:23

Lea otras preguntas en las etiquetas