Linux'ta şu anki saati milisaniye cinsinden nasıl alabilirim?
Yanıtlar:
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:
#define _POSIX_C_SOURCE 200809L
#include <inttypes.h>
#include <math.h>
#include <stdio.h>
#include <time.h>
void print_current_time_with_ms (void)
{
long ms; // Milliseconds
time_t s; // Seconds
struct timespec spec;
clock_gettime(CLOCK_REALTIME, &spec);
s = spec.tv_sec;
ms = round(spec.tv_nsec / 1.0e6); // Convert nanoseconds to milliseconds
if (ms > 999) {
s++;
ms = 0;
}
printf("Current time: %"PRIdMAX".%03ld seconds since the Epoch\n",
(intmax_t)s, ms);
}
Amacınız geçen zamanı ölçmekse ve sisteminiz "monoton saat" seçeneğini destekliyorsa, CLOCK_MONOTONICbunun yerine kullanmayı düşünmelisiniz CLOCK_REALTIME.
gcckomuta.
s, bu olduğunda artırmanız gerekir . Muhtemelen nadir bir olaydır, ancak fazladan rakam soruna neden olabilir.
Milisaniye cinsinden geçerli zaman damgasını almak için kullanım işlevi aşağıdadır:
#include <sys/time.h>
long long current_timestamp() {
struct timeval te;
gettimeofday(&te, NULL); // get current time
long long milliseconds = te.tv_sec*1000LL + te.tv_usec/1000; // calculate milliseconds
// printf("milliseconds: %lld\n", milliseconds);
return milliseconds;
}
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.
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?
NULLgereken makul değerdir. Ve testin her zaman bir şeyleri kanıtlamak için iyi bir yaklaşım olduğuna inanıyorum.
gettimeofday()Zamanı saniye ve mikrosaniye cinsinden almak için kullanın . Milisaniyelere birleştirmek ve yuvarlamak, bir egzersiz olarak bırakılmıştır.
C11 timespec_get
Uygulamanın çözünürlüğüne yuvarlanan nanosaniyeye kadar geri döner.
Zaten Ubuntu 15.10'da uygulanmaktadır. API, POSIX ile aynı görünür clock_gettime.
#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Daha fazla ayrıntı burada: https://stackoverflow.com/a/36095407/895245
Dan Moulding'in POSIX cevabından türetilmiştir, bu işe yaramalıdır:
#include <time.h>
#include <math.h>
long millis(){
struct timespec _t;
clock_gettime(CLOCK_REALTIME, &_t);
return _t.tv_sec*1000 + lround(_t.tv_nsec/1.0e6);
}
David Guyon'un da belirttiği gibi: -lm ile derleyin
Bu sürüm matematik kitaplığına ihtiyaç duymaz ve clock_gettime () işlevinin dönüş değerini kontrol eder.
#include <time.h>
#include <stdlib.h>
#include <stdint.h>
/**
* @return milliseconds
*/
uint64_t get_now_time() {
struct timespec spec;
if (clock_gettime(1, &spec) == -1) { /* 1 is CLOCK_MONOTONIC */
abort();
}
return spec.tv_sec * 1000 + spec.tv_nsec / 1e6;
}
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.