Получить отформатированную дату с временной отметки с округленными миллисекундами Bash Shell Script - программирование
Подтвердить что ты не робот

Получить отформатированную дату с временной отметки с округленными миллисекундами 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"`
4b9b3361

Ответ 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.