प्रारूप में C में समय निकालने का सबसे अच्छा तरीका क्या है 2009‐08‐10
18:17:54.811
?
प्रारूप में C में समय निकालने का सबसे अच्छा तरीका क्या है 2009‐08‐10
18:17:54.811
?
जवाबों:
स्ट्रैपटाइम () का उपयोग करें ।
#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 का उपयोग करके मिलीसेकंड में समय कैसे मापें?
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.
उपरोक्त उत्तर प्रश्न (विशेष रूप से मिलीसेक भाग) का पूरी तरह से उत्तर नहीं देते हैं। मेरा समाधान यह है कि स्ट्रैटेम से पहले गेटटाइमफीड का उपयोग करें। "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
विंडोज कार्यान्वयन पर उपलब्ध नहीं है
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
यदि आप वास्तव में ऐनक से विवश हैं और दिन और घंटे के बीच का स्थान नहीं चाहते हैं, तो बस इसे प्रारूप स्ट्रिंग से हटा दें।
माइक्रोसेकंड परिशुद्धता के साथ कोड प्रिंट के बाद। हम सभी यह करना है इस्तेमाल होता है 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;
}
आप उपयोग कर सकते हैं 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);
छल:
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);
इस पृष्ठ पर किसी भी समाधान ने मेरे लिए काम नहीं किया, मैंने उन्हें मिश्रित किया और उन्हें विंडोज और विज़ुअल स्टूडियो 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