คำสั่งเพื่อรับเวลาเป็นมิลลิวินาที


286

มีคำสั่งเชลล์ใน Linux เพื่อให้ได้เป็นมิลลิวินาทีหรือไม่


12
date +%s.%Nจะให้นาโนวินาทีคุณทำงานกับมันได้ไหม
Wrikken

1
@Wrikken นี่มันไม่ค่อยพกพาเท่าไหร่
Camilo Martin

16
วันที่ + "% Y% m% d.% H% M% S% 3N" - โดยทั่วไปฉันใช้คำสั่งนี้เพื่อรับเวลา fulldate และเวลาที่ไม่ซ้ำจนถึงมิลลิวินาทีเพื่อสร้างชื่อไฟล์ชั่วคราวในสคริปต์ทุบตียูนิกซ์ หากระบบของคุณไม่สามารถรับมือกับมิลลิวินาทีคุณสามารถไปที่ไมโครวินาทีหรือนาโนวินาทีโดยใช้ 3 ถึง 6 และ 9 ตามลำดับ
Nitin Mahesh

ลองdate -Ins
Dr. Person Person II

คำตอบ:


344

date +%s%N ส่งคืนจำนวนวินาที + nanoseconds ปัจจุบัน

ดังนั้นecho $(($(date +%s%N)/1000000))เป็นสิ่งที่คุณต้องการ

ตัวอย่าง:

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

date +%s ส่งคืนจำนวนวินาทีตั้งแต่ยุคหากมีประโยชน์


69
ไม่ทำงานบน Mac OS เนื่องจาก%Nไม่รองรับdate
yegor256

33
คำถามกำลังขอคำสั่ง Linux @ คำตอบ Alper ของการทำงานที่ดีสำหรับคำสั่งวันที่มีcoreutils GNU GNUtize OSX ของคุณ: ติดตั้งและใช้ GNU Command Line Tools บน 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" ส่งคืนเวลาปัจจุบันด้วย nanoseconds

    06:46:41.431857000
  • date +"%T.%6N" ส่งคืนเวลาปัจจุบันโดยปัดเศษ nanosecond เป็น 6 หลักแรกซึ่งคือ microseconds

    06:47:07.183172
  • date +"%T.%3N" ส่งคืนเวลาปัจจุบันโดยปัดเศษ nanosecond เป็น 3 หลักแรกซึ่งเป็นมิลลิวินาที

    06:47:42.773

โดยทั่วไปทุกฟิลด์ของdateรูปแบบของคำสั่งสามารถกำหนดความกว้างของฟิลด์ที่เป็นตัวเลือกได้


32
%xN: หนึ่งที่ดีสำหรับความกว้างของฟิลด์!
fduff

1
วันที่ + "% Y% m% d.% H% M% S% 3N" เป็นมิลลิวินาที
Nitin Mahesh

4
ฉันเดาว่านี่เป็นคำตอบที่ดีกว่าคำตอบที่ถูกต้องว่าเหมาะสม
kcondezo

74

นาโนคือ 10 -9และหนึ่งในพัน 10 -3 ดังนั้นเราสามารถใช้อักขระสามตัวแรกของ nanoseconds เพื่อรับมิลลิวินาที:

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

นี่เป็นการดำเนินการที่ราคาถูกมากซึ่งทำงานกับ shell internals และ procfs


1
มีเพียงหนึ่งเดียวเท่านั้นที่ทำงานบน Xeon Phi BusyBox v1.27.0 (2017-09-27 13:20:28 EDT) MicroOS - ยินดีที่จะโหวตสามครั้ง!
Cadoiz

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คุณแปลล่ามภาษาไพ ธ อนให้มันโหลดไลบรารี่ของคุณ / เตรียมข้อมูลเบื้องต้นเขียนผลลัพธ์และออกผลลัพธ์นั้นจะไม่ถูกต้องอีกต่อไป
Charles Duffy

4

คำตอบอื่น ๆ น่าจะเพียงพอในกรณีส่วนใหญ่ แต่ฉันคิดว่าฉันเพิ่มสองเซ็นต์ของฉันเนื่องจากฉันพบปัญหาในระบบBusyBox

ระบบที่เป็นปัญหาไม่รองรับ%Nตัวเลือกการจัดรูปแบบและไม่มีตัวแปล Python หรือ Perl

หลังจากเกาหัวไปมากเรา (ขอบคุณเดฟ!) ขึ้นมาด้วยสิ่งนี้:

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

มันแยกวินาทีและไมโครวินาทีจากเอาท์พุทของadjtimex(ปกติใช้เพื่อตั้งค่าตัวเลือกสำหรับนาฬิการะบบ) และพิมพ์โดยไม่มีบรรทัดใหม่ โปรดทราบว่าฟิลด์ microseconds จะต้องมีการเติมล่วงหน้าด้วยศูนย์ แต่สิ่งนี้จะไม่ส่งผลต่อฟิลด์วินาทีซึ่งยาวกว่าหกหลัก จากนี้คุณควรแปลงไมโครวินาทีเป็นมิลลิวินาที

หากคุณต้องการบรรทัดใหม่ที่ตามมา (อาจเป็นเพราะมันดูดีกว่า) ลองทำดู

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 ได้อย่างไร
Satria

วิธีแก้ปัญหา busybox ที่ยอดเยี่ยม
Codebling

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 ms (1/60 วินาที) หรือไม่?
ปีเตอร์มอร์เทนเซ่น

ใช่ Python time.time()ส่งคืนทศนิยม 6 ตำแหน่งอย่างน้อยใน macOS
porglezomp

1

ฉันแค่อยากจะเพิ่มคำตอบของ Alperสิ่งที่ฉันต้องทำเพื่อให้สิ่งนี้ทำงาน:

บน 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-01TT: 00: 00 ในความแม่นยำระดับรอง

the_time = gettimeofday() ส่งคืนเวลาเป็นวินาทีที่ผ่านไปตั้งแต่ 1970-01-01 UTC เป็นค่าทศนิยม หากเวลาที่ไม่สามารถใช้งานบนแพลตฟอร์มนี้ผลตอบแทนและการตั้งค่า-1 เวลาที่ส่งคืนควรมีความแม่นยำรองวินาทีแต่ความแม่นยำจริงอาจแตกต่างกันไปตามแพลตฟอร์ม หากการเรียกระบบC มาตรฐานพร้อมใช้งานบนแพลตฟอร์มนี้ก็จะส่งกลับค่า มิฉะนั้นถ้าบน MS-Windows ก็พยายามที่จะใช้ERRNOgettimeofday()GetSystemTimeAsFileTime()

แหล่งที่มา: คู่มือ GNU awk

บนระบบ Linux ฟังก์ชัน C มาตรฐานgetimeofday()จะคืนค่าเวลาด้วยความแม่นยำระดับไมโครวินาที


0

เพื่อแสดงวันที่ด้วยเวลาและเขตเวลา

วันที่ + "% d-% m-% Y% T. % N% Z"

เอาท์พุท: 22-04-2020 18: 01: 35.970289239 IST

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.