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