Как получить миллисекунды с эпохи Unix?

Вот один способ сделать это: набор dirnames как завершение по умолчанию, и генерируют пользовательские завершения для второго аргумента.

_some_func () {
  case $COMP_CWORD in
    1) :;; # let the default take over
    2) COMPREPLY=($(compgen -W "go unbind" "${COMP_WORDS[$COMP_CWORD]}"));;
    *) COMPREPLY=("");;
  esac
}
complete -F _some_func -d some_func

Вы могли также звонить compgen -d когда $COMP_CWORD 1, но это не работает хорошо в ударе, потому что необходимо выйти из пробела в выводе compgen, и Вы не можете отличить новую строку, которая разделяет два результата новой строки, которая содержится в завершении (редкий, но возможный).

31
18.01.2014, 17:35
5 ответов

date +%s.%N даст Вам, например, 1364391019.877418748. %N является числом наносекунд, истекших в текущую секунду. Заметьте, что это - 9 цифр, и датой по умолчанию заполнит это нулями, если это будут меньше чем 100 000 000. Это - на самом деле проблема, если мы хотим сделать математику с числом, потому что удар рассматривает числа с начальным нулем как восьмеричные. Это дополнение может быть отключено при помощи дефиса в полевой спецификации, таким образом:

echo $((`date +%s`*1000+`date +%-N`/1000000))

наивно дал бы Вам миллисекунды с эпохи.

Однако как Stephane Chazelas указывает в комментарии ниже, этому отличающиеся два года date вызовы, которые уступят два немного отличающихся раза. Если второе перевернулось промежуточный их, вычисление будет всей секундой прочь. Так:

echo $(($(date +'%s * 1000 + %-N / 1000000')))

Или оптимизированный (благодаря комментариям ниже, хотя это должно было быть очевидно):

echo $(( $(date '+%s%N') / 1000000));
29
27.01.2020, 19:37
  • 1
    я попробовал его и это работает, благодарит +1/accept! –  Eduard Florinescu 27.03.2013, 15:38
  • 2
    Обратите внимание промежуточный время выполнение первого свидания и второй даты несколько миллионов наносекунд, возможно, передали, и это даже не могла бы быть та же секунда. Лучше всего сделать $(($(date +'%s * 1000 + %N / 1000000'))). Это все еще не имеет большого смысла, но было бы более надежным. –  Stéphane Chazelas 27.03.2013, 18:24
  • 3
    Зафиксированный путем выключения нуля, дополняющего, как отмечено на дате (1) –  Alois Mahdal 27.03.2013, 21:09
  • 4
    %N не доступно в BSD и OS X. –  orkoden 29.01.2015, 13:20

В случае, если любой использует другие оболочки, чем bash, ksh93 и zsh имейте плавающую точку $SECONDS переменная, если Вы делаете a typeset -F SECONDS который может быть удобным для измерения времени с точностью:

$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed

Начиная с версии 4.3.13 (2011) zsh имеет a $EPOCHREALTIME специальная переменная с плавающей точкой в zsh/datetime модуль:

$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993

Обратите внимание, что это получено из этих двух целых чисел (в течение многих секунд и наносекунд) возвращенный clock_gettime(). В большинстве систем это - больше точности, чем единственный C double число с плавающей точкой может содержать, таким образом, Вы потеряете точность при использовании его в арифметических выражениях (за исключением дат за первые несколько месяцев 1970).

$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064

Для вычислений разницы во времени высокой точности (хотя я сомневаюсь относительно необходимости в больше, чем точность миллисекунды) можно хотеть использовать $epochtime специальный массив вместо этого (который содержит секунды и наносекунды как два отдельных элемента).

Начиная с версии 5.7 (2018) strftime оболочка, встроенная также, поддерживает a %N формат наносекунды а-ля GNU date и a %. для определения точности, таким образом, количество миллисекунд, так как эпоха может также быть получена с:

zmodload zsh/datetime
strftime %s%3. $epochtime

(или снабженный в переменной -s var)

11
27.01.2020, 19:37

Для предотвращения вычислений для получения миллисекунд командная строка, интерпретаторы JavaScript могут помочь:

bash-4.2$ node -e 'console.log(new Date().getTime())' # node.js
1364391220596

bash-4.2$ js60 -e 'print(new Date().getTime())'       # SpiderMonkey
1364391220610

bash-4.2$ jsc -e 'print(new Date().getTime())'        # WebKit 
1364391220622

bash-4.2$ seed -e 'new Date().getTime()'              # GNOME object bridge
1364391220669

Пакеты, содержащие те интерпретаторы на Ubuntu Eoan:

8
27.01.2020, 19:37
[1129156] С реализацией GNU или ast-open [1129493]date[1129494] (или busybox', если собрана с включенной опцией [1129495]FEATURE_DATE_NANO[1129496]), я бы использовал:

netsh> interface ipv4
netsh interface ipv4> add route

, что возвращает миллисекунды с эпохи Unix.[1129159].

49
27.01.2020, 19:37

В bash 5+ есть переменная с микро -секундной гранулярностью:$EPOCHREALTIME.

Так:

$ echo "$(( ${EPOCHREALTIME//.} / 1000 ))"
1568385422635

Печатает время с начала эпохи (1/1/70 )в миллисекундах.

В противном случае вы должны использовать дату. Либо дата GNU:

echo "$(date +'%s%3N')"

Одна из альтернатив, перечисленных вhttps://serverfault.com/a/423642/465827

Или brew install coreutilsдля OS X

Или, если ничего не помогает, скомпилируйте (gcc epochInµsec.c )эту программу на c (при необходимости отрегулируйте):

#include <stdio.h>
#include <sys/time.h>
int main(void)
{
  struct timeval time_now;
    gettimeofday(&time_now,NULL);
    printf ("%ld secs, %ld usecs\n",time_now.tv_sec,time_now.tv_usec);

    return 0;
}

Обратите внимание, что вызову любой внешней программы требуется время для чтения и загрузки с диска, запуска, выполнения и, наконец, для печати вывода. Это займет несколько миллисекунд. Это минимальная точность, которая может быть достигнута с помощью любого внешнего инструмента (, включая дату ).

5
27.01.2020, 19:37

Теги

Похожие вопросы