Converte una stringa di data per il comando data o systemsetup

0

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

1 risposta

3

Per impostare correttamente una data e un'ora di sistema più o meno attuali con date e wget usa:

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)"

L'utilizzo di ... cut -d' ' -f5-8)" (guarda il tuo commento) tralascia il fuso orario e dovresti aggiungere 1 o 2 ore a seconda dello stato del giorno, risparmiando tempo per regolare l'ora locale.

Il risultato di wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-9 è qualcosa come 12 maggio 2017 12:17:00 GMT .

Quindi il formato data / ora del comando date per impostare data / ora deve essere %d %b %Y %H:%M:%S %Z . Poiché maggio è il breve così come il nome lungo del mese e non conosciamo il formato del nome del mese nella risposta di Google,% b potrebbe dover essere sostituito da% B in giugno : -).

A causa di ritenzione e altre carenze, questo non è molto accurato e il ∂ è fino a 3,5 secondi (di solito 0,32 secondi qui) rispetto al tempo ricevuto tramite ntp.

Per eliminare l'errore sntp menzionato nel tuo commento, fai quanto segue:

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

Ora sntp fr.pool.ntp.org e sudo sntp -s fr.pool.ntp.org dovrebbero funzionare.

    
risposta data 12.05.2017 - 14:23
fonte

Leggi altre domande sui tag