प्रारूप में समय कैसे प्रिंट करें: 2009‐08 print10 18: 17: 54.811


जवाबों:


107

स्ट्रैपटाइम () का उपयोग करें ।

#include <stdio.h>
#include <time.h>

int main()
{
    time_t timer;
    char buffer[26];
    struct tm* tm_info;

    timer = time(NULL);
    tm_info = localtime(&timer);

    strftime(buffer, 26, "%Y-%m-%d %H:%M:%S", tm_info);
    puts(buffer);

    return 0;
}

मिलीसेकंड भाग के लिए, इस प्रश्न पर एक नज़र डालें। ANSI C का उपयोग करके मिलीसेकंड में समय कैसे मापें?


यह अब और भी बेहतर उत्तर है, और यह देखने के लिए कि कैसे मिलीसेकंड भाग को संभालना है। मुझे लगता है कि आपका बफर अब थोड़ा सा लंबा है, हालांकि इसे होने की जरूरत है।
जैक केली

14
छोटे से लंबे होने से बेहतर है :-)
paxdiablo

शानदार जवाब। मैं PHP में सभी प्रकार की चीजें कर सकता था, लेकिन यह जानता था कि यह सब पहले से ही सी। थैंक्स में था।
विजय कुमार कांता

1
शायद लाइन time(&timer)बल्कि timer = time(NULL);कम से कम लिनक्स के लिए होनी चाहिए । The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
एंटोनिन डेसिमो

5
कम से कम एक मामले (लिनक्स) में उत्तर निश्चित रूप से गलत है क्योंकि स्थानीय समय () द्वारा उपयोग किए जाने वाले "स्ट्रक्चर टीएम" सेकंड के नीचे किसी भी समय की जानकारी नहीं रखता है। इसके बदले में गेटाइमोफ़डे () द्वारा उपयोग किए जाने वाले "संरचनात्मक टाइमवैल" में माइक्रोसेकंड होते हैं, जो 1000 से विभाजित होते हैं, मिलिसेकंड होंगे। उन सभी upvotes वास्तव में गलत और भ्रामक हैं! जब तक कोई रिपोर्ट नहीं करता है कि किस संरचना के तहत आपको "स्ट्रक्चर टीएम" के साथ दूसरे के नीचे समय का विवरण मिलता है।
EnzoR

30

उपरोक्त उत्तर प्रश्न (विशेष रूप से मिलीसेक भाग) का पूरी तरह से उत्तर नहीं देते हैं। मेरा समाधान यह है कि स्ट्रैटेम से पहले गेटटाइमफीड का उपयोग करें। "1000" तक मिलिंग चक्कर से बचने के लिए ध्यान दें। यह हामिद नज़ारी के जवाब पर आधारित है।

#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <math.h>

int main() {
  char buffer[26];
  int millisec;
  struct tm* tm_info;
  struct timeval tv;

  gettimeofday(&tv, NULL);

  millisec = lrint(tv.tv_usec/1000.0); // Round to nearest millisec
  if (millisec>=1000) { // Allow for rounding up to nearest second
    millisec -=1000;
    tv.tv_sec++;
  }

  tm_info = localtime(&tv.tv_sec);

  strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", tm_info);
  printf("%s.%03d\n", buffer, millisec);

  return 0;
}

gettimeofdayविंडोज कार्यान्वयन पर उपलब्ध नहीं है
मेंडेस

निर्माण करते समय कृपया '-lm' विकल्प जोड़ें।
10

3
मुझे लगता है कि बफर [24] पर्याप्त है, इसका कारण नीचे दिया गया है, YYYY: MM: DD HH: MM: SS.mmm + '\ 0', 24 है।
Skysign

@ दोस्तों, विंडोज का जिक्र क्यों? सवाल सादे सी भाषा के बारे में है। यह एक बेहतर उत्तर है (हालांकि सही नहीं है), उन सभी गलत उतार-चढ़ाव के बावजूद!
EnzoR

2
user3624334: नहीं, आप कोड को नहीं समझते हैं। समय के लिए केवल एक अनुरोध है। मुझे लगता है कि आप स्थानीय कॉल का मतलब है - यह सिर्फ gettimeofday से उत्पादन में सुधार।
क्रिस

12

time.hएक strftimeफ़ंक्शन को परिभाषित करता है जो आपको किसी time_tचीज़ का उपयोग करने का एक पाठीय प्रतिनिधित्व दे सकता है जैसे:

#include <stdio.h>
#include <time.h>
int main (void) {
    char buff[100];
    time_t now = time (0);
    strftime (buff, 100, "%Y-%m-%d %H:%M:%S.000", localtime (&now));
    printf ("%s\n", buff);
    return 0;
}

लेकिन यह आपको उप-दूसरा रिज़ॉल्यूशन नहीं देगा क्योंकि यह ए से उपलब्ध नहीं है time_t। यह आउटपुट:

2010-09-09 10:08:34.000

यदि आप वास्तव में ऐनक से विवश हैं और दिन और घंटे के बीच का स्थान नहीं चाहते हैं, तो बस इसे प्रारूप स्ट्रिंग से हटा दें।


मिलीसेकंड के लिए प्रदर्शन को भरने के लिए तेज चाल के लिए +1। मेरे पास एक बार एक ग्राहक था जो चाहता था कि मैं ऐसा करूं, लेकिन गैर-शून्य अंकों के साथ ऐसा लग रहा था कि वहां महत्व था। मैंने उससे बात की, लेकिन शून्य में डालने के लिए सहमत हो गया।
RBerteig

4
मेरे एक दोस्त (निश्चित रूप से मुझे नहीं) ने एक बार इसी तरह की चाल का इस्तेमाल किया - उन्होंने अंतिम दूसरे और "मिलीसेकंड" वाले स्टैटिक्स रखे। जहां दूसरी बार पिछली बार से नहीं बदला गया था, उन्होंने सिर्फ 1 और 200 के बीच मिलीसेक के बीच एक यादृच्छिक मूल्य जोड़ा (यह सुनिश्चित करते हुए कि यह निश्चित रूप से 999 से आगे नहीं गया - रैंड के लिए वास्तविक अधिकतम) हमेशा न्यूनतम था 200 और आधी दूरी 999)। जहाँ दूसरे ने बदलाव किया, उन्होंने ऐड से पहले सिर्फ मिलीसेक को 0 पर सेट किया। अच्छा प्रतीत होता है यादृच्छिक लेकिन ठीक से मिलीसेकंड और ग्राहक कोई भी समझदार नहीं था :-)
paxdiablo

5

माइक्रोसेकंड परिशुद्धता के साथ कोड प्रिंट के बाद। हम सभी यह करना है इस्तेमाल होता है gettimeofdayऔर strftimeपर tv_secऔर संलग्न tv_usecनिर्माण स्ट्रिंग के लिए।

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
int main(void) {
    struct timeval tmnow;
    struct tm *tm;
    char buf[30], usec_buf[6];
    gettimeofday(&tmnow, NULL);
    tm = localtime(&tmnow.tv_sec);
    strftime(buf,30,"%Y:%m:%dT%H:%M:%S", tm);
    strcat(buf,".");
    sprintf(usec_buf,"%dZ",(int)tmnow.tv_usec);
    strcat(buf,usec_buf);
    printf("%s",buf);
    return 0;
}

2

आप उपयोग कर सकते हैं strftime, लेकिन struct tmसेकंड के कुछ हिस्सों के लिए रिज़ॉल्यूशन नहीं है। मुझे यकीन नहीं है कि अगर आपके उद्देश्यों के लिए बिल्कुल आवश्यक है।

struct tm tm;
/* Set tm to the correct time */
char s[20]; /* strlen("2009-08-10 18:17:54") + 1 */
strftime(s, 20, "%F %H:%M:%S", &tm);

2

छल:

    int time_len = 0, n;
    struct tm *tm_info;
    struct timeval tv;

    gettimeofday(&tv, NULL);
    tm_info = localtime(&tv.tv_sec);
    time_len+=strftime(log_buff, sizeof log_buff, "%y%m%d %H:%M:%S", tm_info);
    time_len+=snprintf(log_buff+time_len,sizeof log_buff-time_len,".%03ld ",tv.tv_usec/1000);

1
कृपया विस्तार से बताएं कि यह क्यों काम करता है। और वास्तव में क्या चल रहा है।
राज कमल

उपरोक्त सभी उदाहरणों के समान, लेकिन केवल अधिक प्रभावी रूप से। `time_len + = snprintf (log_buff + time_len, sizeof log_buff-time_len," log var is =% s ", logvar); int ret = लिखना (log_fd, log_buff, time_len); `
Андрей Мельников

मैं कहाँ से gettimeofday आयात करते हैं?
एंड्रीप

1

इस पृष्ठ पर किसी भी समाधान ने मेरे लिए काम नहीं किया, मैंने उन्हें मिश्रित किया और उन्हें विंडोज और विज़ुअल स्टूडियो 2019 के साथ काम करने के लिए बनाया, यहां बताया गया है:

#include <Windows.h>
#include <time.h> 
#include <chrono>

static int gettimeofday(struct timeval* tp, struct timezone* tzp) {
    namespace sc = std::chrono;
    sc::system_clock::duration d = sc::system_clock::now().time_since_epoch();
    sc::seconds s = sc::duration_cast<sc::seconds>(d);
    tp->tv_sec = s.count();
    tp->tv_usec = sc::duration_cast<sc::microseconds>(d - s).count();
    return 0;
}

static char* getFormattedTime() {
    static char buffer[26];

    // For Miliseconds
    int millisec;
    struct tm* tm_info;
    struct timeval tv;

    // For Time
    time_t rawtime;
    struct tm* timeinfo;

    gettimeofday(&tv, NULL);

    millisec = lrint(tv.tv_usec / 1000.0);
    if (millisec >= 1000) 
    {
        millisec -= 1000;
        tv.tv_sec++;
    }

    time(&rawtime);
    timeinfo = localtime(&rawtime);

    strftime(buffer, 26, "%Y:%m:%d %H:%M:%S", timeinfo);
    sprintf_s(buffer, 26, "%s.%03d", buffer, millisec);

    return buffer;
}

परिणाम :

2020: 08: 02 06: 41: 59.107

2020: 08: 02 06: 41: 59.196

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