Apa metode terbaik untuk mencetak waktu dalam format C 2009‐08‐10
18:17:54.811
?
97
Gunakan strftime () .
#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;
}
Untuk bagian milidetik, lihat pertanyaan ini. Bagaimana mengukur waktu dalam milidetik menggunakan ANSI C?
time(&timer)
seharusnyatimer = time(NULL);
, setidaknya untuk Linux.The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
Jawaban di atas tidak sepenuhnya menjawab pertanyaan (khususnya bagian milidetik). Solusi saya untuk ini adalah menggunakan gettimeofday sebelum strftime. Perhatikan kehati-hatian untuk menghindari pembulatan milidetik ke "1000". Ini berdasarkan jawaban Hamid Nazari.
#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; }
sumber
gettimeofday
tidak tersedia pada implementasi Windowstime.h
mendefinisikan sebuahstrftime
fungsi yang dapat memberi Anda representasi tekstual dari sebuahtime_t
penggunaan seperti:#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; }
tapi itu tidak akan memberi Anda resolusi sub-detik karena itu tidak tersedia dari
time_t
. Ini menghasilkan:2010-09-09 10:08:34.000
Jika Anda benar-benar dibatasi oleh spesifikasi dan tidak menginginkan spasi antara hari dan jam, hapus saja dari format string.
sumber
Kode berikut dicetak dengan presisi mikrodetik. Yang harus kita lakukan adalah penggunaan
gettimeofday
danstrftime
padatv_sec
dan appendtv_usec
ke string dibangun.#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; }
sumber
Anda dapat menggunakan
strftime
, tetapistruct tm
tidak memiliki resolusi untuk beberapa detik. Saya tidak yakin apakah itu benar-benar diperlukan untuk tujuan Anda.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);
sumber
menipu:
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);
sumber
Tidak ada solusi di halaman ini yang berfungsi untuk saya, saya mencampurnya dan membuatnya berfungsi dengan Windows dan Visual Studio 2019, Begini Caranya:
#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; }
Hasil:
sumber