Получить отформатированную дату с временной отметки с округленными миллисекундами Bash Shell Script
Мне нужно получить дату в определенном формате, но не могу решить, как это сделать.
Вот как я получаю дату на данный момент.
date -r "$timestamp" +'%Y-%m-%dT%H:%M:%S.s'
Однако проблема в миллисекундах имеет слишком много цифр для формата, который мне нужен. Мне нужно, чтобы миллисекунды были ограничены тремя цифрами.
Любая идея, как я могу это сделать?
Текущее обходное решение
Неточно, но он работает. Затем я вычисляю миллисекунды, а затем просто беру первые три символа строки. Очевидно, это не учитывает округление.
date_string_one=`date -r "$timestamp" +'%Y-%m-%dT%H:%M:%S.'`
date_string_milli=`date -r "$timestamp" +'%s'`
date_string="$date_string_one"`printf "%.3s" "$date_string_milli"`
Ответы
Ответ 1
Вы можете просто использовать %3N
для усечения наносекунд к 3 наиболее значимым цифрам:
$ date +"%Y-%m-%d %H:%M:%S,%3N"
2014-01-08 16:00:12,746
или
$ date +"%F %T,%3N"
2014-01-08 16:00:12,746
testet with "GNU bash, версия 4.2.25 (1) -release (i686-pc-linux-gnu)"
Но имейте в виду, что% N не может быть реализовано в зависимости от вашей целевой системы или версии bash.
Протестировано на встроенной системе "GNU bash, версия 4.2.37 (2) -release (arm-buildroot-linux-gnueabi)" не было %N
:
date +"%F %T,%N"
2014-01-08 16:44:47,%N
Ответ 2
Миллион способов сделать это. Один простой способ - удалить конечные числа...
date +'%Y-%m-%d %H:%M:%S.%N' | sed 's/[0-9][0-9][0-9][0-9][0-9][0-9]$//g'
или
date +'%Y-%m-%d %H:%M:%S.%N' | sed 's/......$//g'
Ответ 3
Я не могу помочь предложить "дешевое" решение...
echo $(date +"%Y-%m-%d-%H:%M:%S.")$((RANDOM%1000))
В конце концов, если точность менее важна, чем уникальность, как это в моем случае... здесь у вас есть.
Ответ 4
Одна проблема: %s
- это не формат даты в миллисекундах, это секунды текущей эпохи.
% N дает наносекунды, я не знаю определенного формата даты для даты GNU, которая дает миллисекунды.
Попробуйте date --help
, чтобы просмотреть все параметры формата.
Ответ 5
Не могу придумать способ сделать это без пары шагов, но это приведет вас туда:
d=$(date +'%Y-%m-%d %H:%M:%S|%N')
ms=$(( ${d#*|}/1000000 ))
d="${d%|*}.$ms"
echo $d
2013-04-16 08:51:48.874
Поскольку все компоненты взяты из одного вызова на сегодняшний день, они будут согласованы.
Ответ 6
str="2013-04-05 13:33:53.180"
dateStr1=`date -d "$str" +'%Y-%m-%d %H:%M:%S.%N'`;
echo $dateStr1
dateStr2=`date -d "$dateStr1" +'%s'`
echo $dateStr2
dateStr3="$dateStr2"`echo ${dateStr1:20:3}`
echo $dateStr3
============================
[Output]
2013-04-05 13:33:53.180000000
1365140033
1365140033180
(выше рассмотрим datestr в UTC)
Ответ 7
Лучший способ - обрезать команду python.
$ python -c "from datetime import datetime; print datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]"
2017-02-15 15:03:03.496
Затем вы можете создать псевдоним в ~/.profile
$ alias datetime='python -c python -c "from datetime import datetime;...'
Или даже создать функцию оболочки
datetime(){
python -c python -c "from datetime import datetime;...
}
Ответ 8
Используйте printf
для фактического форматирования; используйте date
для создания набора аргументов
printf
необходимо заполнить строку формата.
printf '%04d-%02d-%02dT%02d:%02d:%02d.%03d' \
$(date -r "${timestamp%.*}" +"%Y %m %d %H %M %S")\
$(( ${timestamp#*.} / 1000 ))
В приведенном выше примере я предполагаю, что ваша временная метка выглядит примерно так: "blahblahblah.728239". Результатом является набор аргументов для printf
как 2013 04 16 11 03 17 728
для создания 2013-04-16T11:03:17.728
.