Linux'ta C'den milisaniye cinsinden şimdiki zaman nasıl alınır?


90

Linux'ta şu anki saati milisaniye cinsinden nasıl alabilirim?

Yanıtlar:


102

Bu, POSIXclock_gettime işlevi kullanılarak gerçekleştirilebilir .

POSIX'in mevcut sürümünde, eskigettimeofday olarak işaretlenmiştir . Bu, spesifikasyonun gelecekteki bir sürümünden kaldırılabileceği anlamına gelir. Uygulama yazarlarının clock_gettimeişlevi yerinegettimeofday .

İşte nasıl kullanılacağına dair bir örnek clock_gettime:

Amacınız geçen zamanı ölçmekse ve sisteminiz "monoton saat" seçeneğini destekliyorsa, CLOCK_MONOTONICbunun yerine kullanmayı düşünmelisiniz CLOCK_REALTIME.


7
POSIX olarak doğru olduğu için +1 - ancak cevabınızda yanlış birimler var. OP zaman istemiyor ile milisaniye ancak zaman içinde milisaniye.
pilcrow

5
İyi bir çözüm unutma ama lm sizin de gcckomuta.
David Guyon

2
Yuvarlak için man sayfasına göre, siz (uzun veya) bir tamsayı sonucu atama lround kullanmak istiyorum
Hildred

2
Hiçbir zaman 1000 ms'ye yuvarlamaması için round () yerine floor () kullanmanız gerekir. Aksi takdirde s, bu olduğunda artırmanız gerekir . Muhtemelen nadir bir olaydır, ancak fazladan rakam soruna neden olabilir.
Mike

1
@Mike Güzel yakala. İki binde bir, o kadar da nadir değil, bu yüzden kesinlikle düzeltilmesi gerekiyor. Zemini kullanmak yerine, biraz daha fazla doğruluğu korumayı ve yuvarlamaya devam etmeyi tercih ederim, ancak ikinci sayacı 1000'e kadar yuvarlarsa artırmayı tercih ederim.
Dan Molding

60

Bunun gibi bir şey yapmalısın:


33

Milisaniye cinsinden geçerli zaman damgasını almak için kullanım işlevi aşağıdadır:

Saat dilimi hakkında :

gettimeofday () desteği, saat dilimini belirtmek için, saat dilimini yok sayan NULL kullanıyorum , ancak gerekirse bir saat dilimi belirtebilirsiniz.


@Update - saat dilimi

Yana longya da öylesine ayarı, saat dilimine kendisi tarafından etkilenen zaman gösterimi alakalı değildir tz() gettimeofday ait param pek de fark etmemesi nedeniyle, gerekli değildir.

Ve man sayfasına göre gettimeofday(), timezoneyapının kullanımı eski, bu nedenle tzargüman normalde NULL olarak belirtilmelidir, ayrıntılar için lütfen man sayfasını kontrol edin.


1
> gettimeofday () desteği zaman dilimini belirtmek için, saat dilimini yok sayan NULL kullanıyorum, ancak gerekirse bir saat dilimi belirtebilirsiniz. Hatalısınız. Saat dilimi, yalnızca localtime () çağrısı yoluyla tanıtılmalıdır.
vitaly.v.ch

@ vitaly.v.ch Bir test yaptım tz, gettimeofday()as parametresini geçerek &(struct timezone tz = {480, 0})herhangi bir uyarı almayacağım ve sonuca herhangi bir etkisi olmadı, bu mantıklı, çünkü zamanın longtemsili ilgili veya etkilenmiyor kendi saat dilimine göre, değil mi?
user218867

Herhangi bir test yapmak için hiçbir sebep yoktu. Linux çekirdeği, zaman dilimleri hakkında doğru bilgiye sahip değildir ve aynı zamanda bunu sağlamanın bir yolu yoktur. Tz argümanının çok özel bir şekilde işlenmesinin bir nedeni. uzun temsil önemli değil.
vitaly.v.ch

@ vitaly.v.ch Belirli bir zaman noktasında, uzun gösterim saat dilimine göre değişmez, bu nedenle önemlidir ve bu nedenle normalde yalnızca geçilmesi NULLgereken makul değerdir. Ve testin her zaman bir şeyleri kanıtlamak için iyi bir yaklaşım olduğuna inanıyorum.
user218867

13

gettimeofday()Zamanı saniye ve mikrosaniye cinsinden almak için kullanın . Milisaniyelere birleştirmek ve yuvarlamak, bir egzersiz olarak bırakılmıştır.



1

Dan Moulding'in POSIX cevabından türetilmiştir, bu işe yaramalıdır:

David Guyon'un da belirttiği gibi: -lm ile derleyin


0

Bu sürüm matematik kitaplığına ihtiyaç duymaz ve clock_gettime () işlevinin dönüş değerini kontrol eder.


1
Lütfen cevabınızın diğer 6 cevaba ne getirdiğini belirtin (özellikle diğer 2 cevabın zaten dayandığı göz önüne alındığında clock_gettime), hangi başlıkları gerektirdiğini ve OP'nin sorusunu hangi şekilde ele aldığını ekleyin. CLOCK_MONOTONICBununla ilgili olarak , standart makroları değişmez değerler yerine doğrudan yanıtlarınızda (ve genel olarak kodunuzda) kullanmanızı öneririm.
PiCTo

1
Bu kod soruyu yanıtlayabilirken, bu kodun soruyu neden ve / veya nasıl yanıtladığına ilişkin ek bağlam sağlamak, uzun vadeli değerini artırır.
Ördek Donald
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.