लिनक्स में C से मिलीसेकंड में वर्तमान समय कैसे प्राप्त करें?


86

मुझे मिलीसेकंड में लिनक्स पर वर्तमान समय कैसे मिलता है?

जवाबों:


100

यह POSIXclock_gettime फ़ंक्शन का उपयोग करके प्राप्त किया जा सकता है ।

POSIX के वर्तमान संस्करण में, gettimeofdayहै अप्रचलित चिह्नित । इसका मतलब है कि यह विनिर्देश के भविष्य के संस्करण से हटाया जा सकता है। एप्लिकेशन लेखकों को clock_gettimeइसके बजाय फ़ंक्शन का उपयोग करने के लिए प्रोत्साहित किया जाता है gettimeofday

यहाँ कैसे उपयोग करने का एक उदाहरण है 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);
}

यदि आपका लक्ष्य बीता हुआ समय मापने का है, और आपका सिस्टम "मोनोटोनिक घड़ी" विकल्प का समर्थन करता है, तो आपको CLOCK_MONOTONICइसके बजाय का उपयोग करने पर विचार करना चाहिए CLOCK_REALTIME


7
POSIXly सही होने के लिए +1 - लेकिन आपके उत्तर में गलत इकाइयाँ हैं। ओपी समय नहीं चाहता है के साथ मिलीसेकेंड, लेकिन समय में मिलीसेकेंड।
पायलट

5
अच्छा समाधान लेकिन मत भूलना -lm अपने में gccआदेश।
डेविड गयोन

2
गोल के लिए मैनपेज के अनुसार, आप पूर्णांक (या लंबे समय) के लिए परिणाम असाइन करते समय घेरना चाहते हैं
hildred

2
आपको राउंड () के बजाय फर्श () का उपयोग करने की आवश्यकता है ताकि यह कभी भी 1000 एमएस तक न हो। अन्यथा ऐसा होने पर आपको वेतन वृद्धि की आवश्यकता होगी s। संभवतः एक दुर्लभ घटना लेकिन अतिरिक्त अंक परेशानी का कारण बन सकता है।
माइक

1
@ माइक अच्छा कैच। दो हजार में से एक पर, यह भी दुर्लभ नहीं है, इसलिए निश्चित रूप से तय किया जाना चाहिए। मंजिल का उपयोग करने के बजाय, मुझे लगता है कि मैं थोड़ी अधिक सटीकता बनाए रखना चाहता हूं और गोल करना जारी रखूंगा, लेकिन दूसरा काउंटर बढ़ाता हूं अगर यह 1000 तक गोल हो जाए।
Dan Moulding

58

आपको कुछ इस तरह करना होगा:

struct timeval  tv;
gettimeofday(&tv, NULL);

double time_in_mill = 
         (tv.tv_sec) * 1000 + (tv.tv_usec) / 1000 ; // convert tv_sec & tv_usec to millisecond

33

मिलीसेकंड में वर्तमान टाइमस्टैम्प प्राप्त करने के लिए उपयोग समारोह निम्नलिखित है:

#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;
}

समयक्षेत्र के बारे में :

gettimeofday () टाइमज़ोन निर्दिष्ट करने के लिए समर्थन, मैं NULL का उपयोग करता हूं , जो टाइमज़ोन को अनदेखा करता है, लेकिन आप आवश्यकता पड़ने पर टाइमज़ोन निर्दिष्ट कर सकते हैं।


@ यूपीडेट - टाइमज़ोन

चूँकि longसमय का प्रतिनिधित्व समय-क्षेत्र से ही संबंधित या प्रभावित नहीं होता है, इसलिए tzगेटाइमोफ़डे () की परम की स्थापना आवश्यक नहीं है, क्योंकि इससे कोई फर्क नहीं पड़ेगा।

और, मैन पेज के अनुसार gettimeofday(), timezoneसंरचना का उपयोग अप्रचलित है, इस प्रकार tzतर्क को आमतौर पर NULL के रूप में निर्दिष्ट किया जाना चाहिए, विवरण के लिए कृपया मैन पेज देखें।


1
> gettimeofday () टाइमज़ोन निर्दिष्ट करने के लिए समर्थन, मैं NULL का उपयोग करता हूं, जो टाइमज़ोन को अनदेखा करता है, लेकिन आप ज़रूरत पड़ने पर टाइमज़ोन निर्दिष्ट कर सकते हैं। तुम गलत हो। समय क्षेत्र को स्थानीय रूप से कॉल के माध्यम से विशेष रूप से पेश किया जाना चाहिए ()।
महत्वपूर्ण .v.ch

@ vitaly.v.ch मैंने एक परीक्षण किया, जैसा कि tzपरम को पास करने से कोई चेतावनी नहीं मिलेगी, और इसका परिणाम पर कोई प्रभाव नहीं पड़ता है, इससे समझ में आता है, क्योंकि समय का प्रतिनिधित्व या प्रभाव के लिए प्रासंगिक नहीं है समय के हिसाब से ही सही? gettimeofday()&(struct timezone tz = {480, 0})long
एरिक वांग

कोई टेस्ट करने का कोई कारण नहीं था। लिनक्स कर्नेल में समय-क्षेत्र के बारे में उचित जानकारी नहीं होती है, और साथ ही इसे प्रदान करने का तरीका नहीं होता है। यह एक कारण है कि tz तर्क को बहुत विशिष्ट तरीके से संसाधित किया जाता है। लंबे प्रतिनिधित्व से कोई फर्क नहीं पड़ता।
vitaly.v.ch

@ vitaly.v.ch एक विशिष्ट समय बिंदु पर, लंबे समय तक प्रतिनिधित्व टाइमज़ोन के कारण भिन्न नहीं होता है, यही कारण है कि यह मायने रखता है, और उसके कारण सामान्य रूप से केवल NULLपास करने के लिए उचित मूल्य है। और, मेरा मानना ​​है कि परीक्षण हमेशा चीजों को साबित करने का एक अच्छा तरीका है।
एरिक वांग

13

gettimeofday()सेकंड और माइक्रोसेकंड में समय पाने के लिए उपयोग करें । मिलिसेकंड के साथ संयोजन और गोलाई को एक अभ्यास के रूप में छोड़ दिया जाता है।


7

C11 timespec_get

यह नैनोसेकंड तक वापस आ जाता है, कार्यान्वयन के संकल्प के लिए गोल हो जाता है।

यह Ubuntu 15.10 में पहले से ही लागू है। API POSIX के समान दिखता है clock_gettime

#include <time.h>
struct timespec ts;
timespec_get(&ts, TIME_UTC);
struct timespec {
    time_t   tv_sec;        /* seconds */
    long     tv_nsec;       /* nanoseconds */
};

अधिक विवरण यहां: https://stackoverflow.com/a/36095407/895245


0

डैन मोल्डिंग के पोसिक्स उत्तर से व्युत्पन्न, यह काम करना चाहिए:

#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);
}

डेविड गयोन द्वारा बताया गया है: -lm के साथ संकलित करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.