Команда, щоб отримати час у мілісекундах


286

Чи є команда оболонки в Linux, щоб отримати час у мілісекундах?


12
date +%s.%Nдали б вам наносекунд, чи можете ви з цим працювати?
Wrikken

1
@Wrikken Хоча це не зовсім портативно.
Каміло Мартін

16
дата + "% Y% m% d.% H% M% S% 3N" - Зазвичай я використовую цю команду, щоб отримати повний і унікальний час до мілілі секунди для створення тимчасових імен файлів у скрипті Unix bash. Якщо ваша система не в змозі впоратися з мільйонними секундами, ви можете перейти до мікро- або наносекунд, використовуючи відповідно 3 до 6 і 9.
Нітін Махеш

Спробуйтеdate -Ins
доктор Персона II

Відповіді:


344

date +%s%N повертає кількість секунд + поточні наносекунди.

Тому echo $(($(date +%s%N)/1000000))це те, що вам потрібно.

Приклад:

$ echo $(($(date +%s%N)/1000000))
1535546718115

date +%s повертає кількість секунд з епохи, якщо це корисно.


69
не працює на Mac OS, оскільки %Nне підтримуєтьсяdate
yegor256

33
Питання задається командою Linux. Відповідь @Alper прекрасно працює для команди date з GNU coreutils . GNUtize your OSX: Встановіть та використовуйте інструменти командного рядка GNU на Mac OS X
caligari

77
date +%s%3Nшвидше (ґрунтуючись на відповіді @ michael-defort)
caligari

10
На OSX потрібно встановити GNU-версію дати як частину coreutilsвикористання MacPorts або Homebrew - потім скористатися gdateкомандою. Дивіться це запитання: stackoverflow.com/questions/9804966/…
Pierz

1
Хоча дата +% s% 3N здається легшою або кращою, але використання її в якомусь іншому розрахунку зміщення спричинило зменшення часової позначки на 1 мілісекунд! Але це рішення спрацювало ідеально з розрахунком зміщення
Arsinux

341
  • date +"%T.%N" повертає поточний час з наносекундами.

    06:46:41.431857000
  • date +"%T.%6N" повертає поточний час з наносекундами, округленими до перших 6 цифр, що становить мікросекунди.

    06:47:07.183172
  • date +"%T.%3N" повертає поточний час з наносекундами, округленими до перших трьох цифр, що становить мілісекунд.

    06:47:42.773

Загалом, кожному полі формату dateкоманди може бути задана необов'язкова ширина поля.


32
%xN: приємний для ширини поля!
fduff

1
дата + "% Y% m% d.% H% M% S% 3N" протягом мілі секунд.
Нітін Махеш

4
Я думаю, це краща відповідь, що той, який позначений як правильний.
kcondezo

74

Нано - 10 −9, а мілі - 10 −3 . Отже, ми можемо використовувати три перші символи наносекунд, щоб отримати мілісекунди:

date +%s%3N

Від man date:

% N наносекунд (000000000..999999999)

% s секунд з 1970-01-01 00:00:00 UTC

Джерело: Помилка сервера Як я можу отримати поточний час Unix в мілісекундах в Bash? .


Я так пишаюся, що @Peter Mortensen зробив одне з чудових активних читань на одному з моїх дописів :) дякую !!
fedorqui 'ТАК перестаньте шкодити'

46

В OS X, де dateне підтримується %Nпрапор, рекомендую встановити coreutilsза допомогою Homebrew . Це дасть вам доступ до команди, яка називається, gdateщо буде вести себе як dateі в системах Linux.

brew install coreutils

Для більш "рідного" досвіду ви завжди можете додати це до свого .bash_aliases:

alias date='gdate'

Потім виконати

$ date +%s%N

10

Ось якийсь портативний злом для Linux для отримання часу в мілісекундах:

#!/bin/sh
read up rest </proc/uptime; t1="${up%.*}${up#*.}"
sleep 3    # your command
read up rest </proc/uptime; t2="${up%.*}${up#*.}"

millisec=$(( 10*(t2-t1) ))
echo $millisec

Вихід:

3010

Це дуже дешева операція, яка працює з внутрішніми оболонками і процесами оболонки.


1
Лише один до цих пір, який працював над Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS - із задоволенням отримав би три рази!
Кадоїз

8

date Команда не надала мілі секунди на OS X, тому використовувала псевдонім від python

millis(){  python -c "import time; print(int(time.time()*1000))"; }

АБО

alias millis='python -c "import time; print(int(time.time()*1000))"'

2
... однак, як тільки ви fork()відключили окремий процес, execвідредагували свій інтерпретатор Python, дозвольте йому завантажити свої бібліотеки / інакше ініціалізувати, записати його результат та вийти, цей результат більше не буде точним.
Чарльз Даффі

4

Інших відповідей, мабуть, достатньо в більшості випадків, але я подумав, що додав би два центи, коли зіткнувся з проблемою в системі BusyBox .

Розглянута система не підтримує параметр %Nформату і не має інтерпретатора Python чи Perl.

Після багатого чесання голови ми (дякую Дейву!) Придумали таке:

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Він витягує секунди і мікросекунди з виходу adjtimex(зазвичай використовується для встановлення параметрів системного годинника) і друкує їх без нових ліній (щоб вони склеїлися). Зауважте, що поле мікросекунд має бути попередньо застелене нулями, але це не впливає на поле секунд, яке довше, ніж шість цифр. З цього слід тривіально перетворити мікросекунди в мілісекунди.

Якщо вам потрібна нова лінія (можливо, тому, що вона виглядає краще), то спробуйте

adjtimex | awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }' && printf "\n"

Також зауважте, що для цього потрібно adjtimexі awkбути доступним. Якщо ні, то з BusyBox ви можете вказати на них локально:

ln -s /bin/busybox ./adjtimex
ln -s /bin/busybox ./awk

А потім зателефонуйте вище

./adjtimex | ./awk '/(time.tv_sec|time.tv_usec):/ { printf("%06d", $2) }'

Або, звичайно, ви могли б помістити їх у своє PATH

Редагувати:

Вище описано на моєму пристрої BusyBox. На Ubuntu я спробував те ж саме і зрозумів, що adjtimexмає різні версії. У Ubuntu це працювало для виведення часу в секундах з десятковими знаками в мікросекунди (включаючи новий проміжок)

sudo apt-get install adjtimex
adjtimex -p | awk '/raw time:/ { print $6 }'

Я б цього не робив на Ubuntu. Я б користувавсяdate +%s%N


Ух, чудова альтернатива! Дійсно, ваша команда працює, але я не маю поняття, чому. Де я можу знайти документацію для команди awk ?! Як у пеклі ви дізналися, як побудувати рядок для отримання потрібної інформації з виводу adjtimex?
Сатрія

Дивовижне рішення для
зайнятих скриньок

1

Для цього Perl можна використовувати навіть на екзотичних платформах типу AIX. Приклад:

#!/usr/bin/perl -w

use strict;
use Time::HiRes qw(gettimeofday);

my ($t_sec, $usec) = gettimeofday ();
my $msec= int ($usec/1000);

my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime ($t_sec);

printf "%04d-%02d-%02d %02d:%02d:%02d %03d\n",
    1900+$year, 1+$mon, $mday, $hour, $min, $sec, $msec;

1

Такий сценарій Python:

import time
cur_time = int(time.time()*1000)

3
це не поверне кількість мілісекунд, це поверне кількість секунд, виражене в мілісекундах. Все буде $ SECONDS000
kilianc

1
Код Python @kilianc maoyang забезпечує мілісекунди.
jlliagre

@jlliagre: Але чи дійсна роздільна здатність часу краща за 16-17 мс (1/60 секунди) чи ні?
Пітер Мортенсен

Так, Python time.time()повертає поплавок до 6 знаків після коми, принаймні на macOS.
porglezomp

1

Я просто хотів додати до відповіді Альпера, що мені потрібно було зробити, щоб цей матеріал працював:

На Mac вам знадобиться brew install coreutils, щоб ми могли використовувати gdate. Інакше в Linux це просто date. І ця функція допоможе вам командами часу, не створюючи тимчасових файлів чи нічого:

function timeit() {
    start=`gdate +%s%N`
    bash -c $1
    end=`gdate +%s%N`
    runtime=$(((end-start)/1000000000.0))
    echo " seconds"
}

І ви можете використовувати його за допомогою рядка:

timeit 'tsc --noEmit'

Мені подобається це рішення, але мене більше цікавлять мілі. Я переніс цю функцію на свій .bashrc в ubuntu:function timeit () { start=$(date +%s%N); $*; end=$(date +%s%N); runtime=$(((end-start)/1000000)); echo "$runtime ms" }
Uluaiv

1

Якщо ви використовуєте GNU AWK з версії 4.1, ви можете завантажити бібліотеку часу і зробити:

$ awk '@load "time"; BEGIN{printf "%.6f", gettimeofday()}'

Це надрукує поточний час у секундах з 1970-01-01T00: 00: 00 з точністю до другої секунди.

the_time = gettimeofday() Повертайте час у секундах, що минув з 1970-01-01 UTC, як значення з плаваючою комою. Якщо час на цій платформі недоступний, поверніться -1та встановіть ERRNO. Повернутий час повинен мати точку другої секунди , але фактична точність може змінюватися залежно від платформи. Якщо gettimeofday()на цій платформі доступний стандартний системний виклик C , він просто повертає значення. В іншому випадку, якщо в MS-Windows, він намагається використовувати GetSystemTimeAsFileTime().

джерело: посібник з GNU awk

У системах Linux стандартна функція C getimeofday()повертає час у точності мікросекунди.


0

Показувати дату з часом та часовим поясом

дата + "% d-% m-% Y% Т.% N% Z"

Вихід: 22-04-2020 18: 01: 35.970289239 IST

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.