Terminaldeki çağdan beri milisaniye cinsinden geçen süre


42

OSX terminalinde dönemin milisaniye cinsinden zamanını nasıl alabilirim?

Linux / Ubuntu eşdeğeri date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

OSX terminalimde çalışmıyor:

OSX $ date +%s.%N
1403377800.N

Yanıtlar:


48

dateOS X programı GNU coreutils farklıdır dateprogramı. Coreutils (gnu-date dahil) kurabilirsiniz, o zaman datemilisaniyeyi destekleyen bir versiyona sahip olacaksınız .

Kaynaktan kurulum yerel OS X kullanıcıları için bir güçlük olabileceğinden, Homebrew'i kullanmanızı tavsiye ediyorum .

Bu araçları Homebrew kullanarak kurmak için terminalinizde bu oneliner'ı çalıştırın:

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

Homebrew şimdi kuruldu (kurulumdan sonra kurulum önerilerini takip etmek akıllıca olacaktır). Şimdi kullanarak coreutils kuracağız brew.

brew install coreutils

Kurulumun dediği gibi, tüm komutlar 'g' ön ekiyle yüklenmiştir (örn. Gdate, gcat, gln, etc, vb.). Bu komutları gerçekten normal adlarıyla kullanmanız gerekiyorsa, PATH ( ~/.bash_profile) öğesine bir "gnubin" dizini ekleyebilirsiniz :

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

Şimdi koşabilirsin

gdate +%s.%N

ve bu, milisaniye cinsinden çağdan beri zamanınızı gösterecektir.


3
Güzel. Hatta yolunu eklemek yoktu gdatemonte edilmiştir /usr/local/bin/gdate.
Adam Matan

Beklediğiniz budur. Tüm ikili dosyalar g öneki ile kurulur. Sağladığım yolda, aynı gnu-coreutils g öneki olmadan. Bu yüzden onu PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH" gibi yolunuza eklerseniz, orijinalleri değiştirir. Yani OS X date, GNU olur date(yerine gdate ait)
CousinCocaine

Tamam işe yaradı.
Kuzen Kokain

3
Teknik olarak, +%s.%Nformat saniye cinsinden değil, nanosaniye hassasiyetine kadar saniye verir. Demlemek için kullandıktan sonra gdate, milisaniyenin kullanılabilir olup olmadığını görmek için manpage'i kontrol ettim. Değil. Ayrıca kesin %Nolarak belirtilebileceğini söylemedi , ama yine de denedim. Saniyeyi yalnızca milisaniye hassasiyetine indirgeme komutunun (yani üç ondalık basamak) olduğunu buldum gdate +%s.%3N.
LS,

10

OS X'te, sadece date +%sOS X'in dateçıktısından bundan daha fazla hassasiyeti desteklemediği ve dahili gösterimle desteklenmeyen fazla hassasiyetin eksi sonsuzluğa indirildiği kesin olarak çalışmaktadır.

Milisaniye çıktı istiyorsanız, yukarıda belirtilen nedenlerden dolayı hassasiyet eklemek yerine yalnızca sıfır ekleyerek düzeltilse de, aşağıdaki komutu kullanabilirsiniz. Aşağıdakiler, gerekli hassasiyeti destekleyen sistemlerde doğru milisaniyeyi gösterir.

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

Yukarıdaki komutun kaynağı: Unix.SE - Unix döneminden beri milisaniye nasıl elde edilir

Yalnızca OS X'te doğru sayıda sıfır ekleyen bir komut istiyorsanız, kullanabilirsiniz:

date +%s000

OS X desteklemiyor %-N, bu yüzden hiçbir şey yapmıyor (ve kabuk değişkeni $Nayarlanmışsa soruna neden olabilir ). Sadece kullanın date +%s000(veya date +%s.000ondalık noktayı istiyorsanız).
Gordon Davisson,

@Gordon Evet, bundan bahsettim, ancak OP bu hassaslığa sahip sistemler üzerinde başarılı bir şekilde çalışan taşınabilir bir çözüm arıyorsa, yukarıdaki komut çalışır. Elbette çıktıya sadece sıfır ekleyebilirsiniz, ancak ekstra hassasiyeti destekleyen diğer sistemlere kopyalamak ideal olmaz.
grg

Ah, anlıyorum. OS X'in Fakat datekomut sadece geçer %-Nolarak aracılığıyla N, bu hesaplama engelleyebilir. Ayarlamayı deneyin N=7000000000000000000, sonra komutu deneyin ... Pratikte bu pek olası bir durum değil, ancak çevreye bağlı olmayan bir şeyle daha güvende hissederim.
Gordon Davisson

@Gordon Gerçekten, değişkeni ayarlamak bozulacaktı - belirli değişken komutun çalıştırılmasından hemen önce sıfırlanabilirdi, ancak bunun gibi değişkenleri sıfırlamak, her durumda iyi komutları çalıştırmadan önce yapması gereken bir şeydi, imo, tam da. Tabii ki, bunların tümü OP'nin tam anlamıyla sıfır eklemek için bir betiği-düzenlenmiş cevap istediği varsayımına dayanıyor.
grg

2
OP, “dönemin, milisaniyeden beri geçen zaman” diye sordu, bu, bir dizgeye nasıl sıfır ekleneceğine dair bir cevap. Aynı değil. Yazıda açıklanmasına rağmen, sorunun cevabı değil.
Kuzen Kokain

6

bu çözüm macOS'ta çalışır.

bash betiği kullanmayı düşünüyorsanız ve python'unuz varsa, şu kodu kullanabilirsiniz:

#!/bin/bash

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

Veya pythondoğrudan bir komut dosyası yazın:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 

4

Perl her yerde.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.