Como defino o tempo atual do Unix em milissegundos?

3

Solução possível

date --set="2011-12-07 01:20:15.962"  && date --rfc-3339=ns

Pergunta original

Eu posso obter a data com milissegundos da seguinte forma:

date +"%S.%N"
date --rfc-3339=ns

De acordo com man date , esperaria poder configurá-lo da seguinte forma:

date --set=%s.%N +'date +"%S.%N"'
date --set="%s.%N" "+1323217126.085882000"

De acordo com o meu googling eu esperaria ser capaz de definir a data como assim (o inverso do acima):

date +%s.%N -s 'date +"%S.%N"'
date +"%s.%N" -s "1323217126.085882000"

Nem trabalho. Alguém pode me dar uma pista sobre o assunto?

P.S. Não, não preciso de resolução de nanossegundos. Sim, eu sei que a execução do bash leva milissegundos. O que eu realmente preciso é de resolução sub-segundo, 10 segundos de um segundo seria bom o suficiente.

    
por CoolAJ86 07.12.2011 / 01:31

2 respostas

4

Aqui está uma solução ( Linux, NOT Unix ):

date --set="2011-12-07 01:20:15.962"  && date --rfc-3339=ns

Observe o atraso:

CURTIME='date --rfc-3339=ns'
date --set="${CURTIME}"    
NEWTIME='date --rfc-3339=ns'
echo ${CURTIME}
echo ${NEWTIME}

2011-12-07 01:48:54.687216122+00:00
2011-12-07 01:48:54.720541318+00:00

Como você notará, milissegundos inteiros de atraso são introduzidos. Isso se deve ao tempo necessário para inicializar a memória e carregar o binário date . Isto é verdade para todos os shells e o exec de insert-higher-level-language-here

No entanto, se você precisar apenas de resolução de segundos abaixo no intervalo de 10 segundos de segundo, isso será bom o suficiente em muitos casos.

    
por 07.12.2011 / 02:39
2

Se o seu objetivo é definir o tempo com intervalos de sub-segundo, então a data parece ser o comando errado se eu estiver lendo a fonte corretamente.

Supondo que você esteja usando a coreutils versão da data, parece-me que when.tv_nsec = 0 line está configurando porção de nanossegundos da variável when , que é uma estrutura timespec para zero. Mesmo se você pudesse convencer a data a aceitar um valor mais preciso, parece-me que seria inútil.

  # time.h
  struct timespec
  {
    __time_t tv_sec;        /* Seconds.  */
    long int tv_nsec;       /* Nanoseconds.  */
  };

  # date.c

  struct timespec when;

  # ...

              valid_date = posixtime (&when.tv_sec,
                                      datestr,
                                      (PDS_TRAILING_YEAR
                                       | PDS_CENTURY | PDS_SECONDS));
              when.tv_nsec = 0; /* FIXME: posixtime should set this.  */
  # ...

          /* Set the system clock to the specified date, then regardless of
             the success of that operation, format and print that date.  */
          if (settime (&when) != 0)
            {
              error (0, errno, _("cannot set date"));
              ok = false;
            }
    
por 07.12.2011 / 02:20