मुझे मिलीसेकंड में लिनक्स पर वर्तमान समय कैसे मिलता है?
जवाबों:
यह 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
।
gcc
आदेश।
s
। संभवतः एक दुर्लभ घटना लेकिन अतिरिक्त अंक परेशानी का कारण बन सकता है।
मिलीसेकंड में वर्तमान टाइमस्टैम्प प्राप्त करने के लिए उपयोग समारोह निम्नलिखित है:
#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 के रूप में निर्दिष्ट किया जाना चाहिए, विवरण के लिए कृपया मैन पेज देखें।
tz
परम को पास करने से कोई चेतावनी नहीं मिलेगी, और इसका परिणाम पर कोई प्रभाव नहीं पड़ता है, इससे समझ में आता है, क्योंकि समय का प्रतिनिधित्व या प्रभाव के लिए प्रासंगिक नहीं है समय के हिसाब से ही सही? gettimeofday()
&(struct timezone tz = {480, 0})
long
NULL
पास करने के लिए उचित मूल्य है। और, मेरा मानना है कि परीक्षण हमेशा चीजों को साबित करने का एक अच्छा तरीका है।
gettimeofday()
सेकंड और माइक्रोसेकंड में समय पाने के लिए उपयोग करें । मिलिसेकंड के साथ संयोजन और गोलाई को एक अभ्यास के रूप में छोड़ दिया जाता है।
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
डैन मोल्डिंग के पोसिक्स उत्तर से व्युत्पन्न, यह काम करना चाहिए:
#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 के साथ संकलित करें