Назад | Перейти на главную страницу

Как установить текущее время Unix в миллисекундах?

Возможное решение

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

Исходный вопрос

Я могу получить дату в миллисекундах так:

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

В соответствии с man date Я ожидал, что смогу установить его так:

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

В соответствии с мой поиск в Google Я бы ожидал, что смогу установить дату так (обратное выше):

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

Ни работать. Может ли кто-нибудь подсказать мне проблему?

P.S. Нет, мне не нужно наносекундное разрешение. Да, я знаю, что выполнение bash занимает миллисекунды. Что мне действительно нужно, так это субсекундное разрешение, десятых долей секунды было бы достаточно.

Вот решение (Linux, а НЕ Unix):

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

Обратите внимание на задержку:

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

Как вы заметили, целые миллисекунды задержки вводятся. Это связано со временем, необходимым для инициализации памяти и загрузки date двоичный. Это верно для всех снарядов и exec вставки-языка-выше-здесь

Однако, если вам просто нужно субсекундное разрешение в диапазоне десятых долей секунды, во многих случаях этого будет достаточно.

Если ваша цель - установить время с субсекундными интервалами, то дата кажется неправильной командой, если я правильно читаю источник.

Предполагая, что вы используете coreutils версия даты, то мне кажется, что when.tv_nsec = 0 линия устанавливает наносекундную часть when переменная, которая является структурой спецификации времени, до нуля. Даже если бы вы смогли убедить date принять более точное значение, мне это кажется бессмысленным.

  # 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;
            }