Waktu dalam milidetik sejak zaman di terminal

42

Bagaimana saya mendapatkan waktu sejak zaman, dalam milidetik, di terminal OSX?

Setara Linux / Ubuntu adalah date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Yang tidak berfungsi di terminal OSX saya:

OSX $ date +%s.%N
1403377800.N
Adam Matan
sumber

Jawaban:

48

The dateprogram OS X berbeda dari coreutils GNU dateProgram. Anda dapat menginstal coreutils (termasuk gnu-date), maka Anda akan memiliki versi dateyang mendukung milidetik.

Karena penginstalan dari sumber dapat merepotkan bagi pengguna OS X asli, saya menyarankan Anda untuk menggunakan Homebrew .

Untuk menginstal alat ini menggunakan Homebrew, jalankan oneliner ini di terminal Anda:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew sekarang terinstal (sebaiknya mengikuti saran penginstal setelah instalasi). Sekarang kita akan menginstal coreutils menggunakan brew.

brew install coreutils

Seperti yang dikatakan dalam instalasi, semua perintah telah diinstal dengan awalan 'g' (mis. Gdate, gcat, gln, dll.). Jika Anda benar-benar perlu menggunakan perintah ini dengan nama normalnya, Anda dapat menambahkan direktori "gnubin" ke PATH Anda ( ~/.bash_profile) seperti:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Anda sekarang dapat berlari

gdate +%s.%N

dan ini akan menampilkan waktu Anda sejak zaman dalam milidetik.

SepupuCocaine
sumber
3
Bagus. Saya bahkan tidak perlu menambahkan path, gdatesudah diinstal di /usr/local/bin/gdate.
Adam Matan
Itu yang Anda harapkan. Semua binari diinstal dengan awalan g. Di jalan saya berikan semua gnu-coreutils yang sama tanpa awalan g. Jadi jika Anda menambahkannya di jalur Anda seperti PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" itu akan menggantikan yang asli. Jadi OS X datemenjadi GNU date(bukan gdate)
CousinCocaine
Baik itu berhasil.
CousinCocaine
3
Secara teknis, +%s.%Nformat memberikan detik ke presisi nanodetik, bukan milidetik. Setelah saya menggunakan minuman untuk menginstal gdate, saya memeriksa halaman manual untuk melihat apakah milidetik tersedia. Ini bukan. Itu juga tidak mengatakan bahwa presisi untuk %Ndapat ditentukan, tetapi saya tetap mencobanya. Saya menemukan bahwa perintah untuk mendapatkan detik ke presisi milidetik saja (yaitu, tiga tempat desimal) adalah gdate +%s.%3N.
LS
10

Di OS X, jalankan saja date +%skarena OS X tidak mendukung presisi lebih dari datekeluaran in ini dan kelebihan kelebihan yang tidak didukung oleh representasi internal terpotong ke minus minus.

Jika Anda ingin output milidetik, Anda dapat menggunakan perintah berikut, meskipun output hanya dikoreksi dengan menambahkan nol daripada menambahkan presisi karena alasan yang disebutkan di atas. Berikut ini tidak menghasilkan milidetik yang benar pada sistem yang mendukung presisi yang diperlukan.

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

Sumber untuk perintah di atas: Unix.SE - Cara mendapatkan milidetik sejak zaman Unix

Jika Anda hanya ingin perintah yang menambahkan jumlah nol yang tepat di OS X, Anda dapat menggunakan:

date +%s000
GRG
sumber
OS X tidak mendukung %-N, sehingga tidak melakukan apa-apa (dan dapat menyebabkan masalah jika variabel shell $Ndiatur). Cukup gunakan date +%s000(atau date +%s.000jika Anda ingin titik desimal).
Gordon Davisson
@ Gordon Ya, saya sebutkan ini, tetapi jika OP mencari solusi portabel yang bekerja dengan baik pada sistem yang mampu presisi itu, perintah di atas bekerja. Tentu saja Anda bisa menambahkan nol ke output tetapi menyalinnya ke sistem lain yang mungkin mendukung presisi ekstra tidak akan ideal.
grg
Ah, begitu. Tetapi karena dateperintah OS X hanya lewat %-Nsebagai N, itu dapat mengganggu perhitungan. Coba pengaturan N=7000000000000000000, lalu coba perintah ... Ini adalah kasus yang tidak mungkin dalam praktek, tetapi saya akan merasa lebih aman dengan sesuatu yang tidak bergantung pada lingkungan.
Gordon Davisson
@Gordon Memang, pengaturan variabel akan merusaknya — saya kira variabel tertentu dapat direset tepat sebelum perintah dijalankan, tetapi mengatur ulang variabel seperti itu adalah sesuatu yang harus dilakukan oleh setiap skrip yang baik sebelum menjalankan perintah, imo, untuk berjaga-jaga. Tentu saja, ini semua didasarkan pada asumsi saya bahwa OP menginginkan sebuah naskah — jawaban yang diedit untuk menyertakan penambahan nol secara literal.
grg
2
OP meminta "waktu sejak zaman, dalam milidetik", ini adalah jawaban tentang cara menambahkan nol ke string. Tidak sama. Meski dijelaskan dalam posting, bukan jawaban untuk pertanyaan itu.
CousinCocaine
6

solusi ini berfungsi pada macOS.

jika Anda mempertimbangkan untuk menggunakan skrip bash dan memiliki python tersedia, Anda dapat menggunakan kode ini:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

Atau tulis pythonskrip langsung:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 
Frank Thonig
sumber
4

Perl ada di mana-mana.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
ernix
sumber