Phương pháp tốt nhất để in ra thời gian ở định dạng C là 2009‐08‐10
18:17:54.811
gì?
Phương pháp tốt nhất để in ra thời gian ở định dạng C là 2009‐08‐10
18:17:54.811
gì?
Câu trả lời:
Sử dụng hàm 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;
}
Đối với phần mili giây, hãy xem câu hỏi này. Làm cách nào để đo thời gian bằng mili giây bằng ANSI C?
time(&timer)
này nên như vậy timer = time(NULL);
, ít nhất là đối với Linux. The tloc argument is obsolescent and should always be NULL in new code. When tloc is NULL, the call cannot fail.
Các câu trả lời trên không trả lời đầy đủ câu hỏi (cụ thể là phần mili giây). Giải pháp của tôi cho điều này là sử dụng gettimeofday trước strftime. Lưu ý cẩn thận để tránh làm tròn số mili giây thành "1000". Điều này dựa trên câu trả lời của 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;
}
gettimeofday
không khả dụng trên các triển khai Windows
time.h
xác định một strftime
hàm có thể cung cấp cho bạn một biểu diễn dạng văn bản của một hàm time_t
như:
#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;
}
nhưng điều đó sẽ không cung cấp cho bạn độ phân giải phụ thứ hai vì nó không có sẵn từ a time_t
. Nó xuất ra:
2010-09-09 10:08:34.000
Nếu bạn thực sự bị giới hạn bởi các thông số kỹ thuật và không muốn có khoảng cách giữa ngày và giờ, chỉ cần xóa nó khỏi chuỗi định dạng.
Sau các bản in mã với độ chính xác micro giây. Tất cả những gì chúng ta phải làm là sử dụng gettimeofday
và strftime
bật tv_sec
và nối tv_usec
vào chuỗi đã xây dựng.
#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;
}
Bạn có thể sử dụng strftime
, nhưng struct tm
không có độ phân giải cho các phần của giây. Tôi không chắc liệu điều đó có hoàn toàn cần thiết cho mục đích của bạn hay không.
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);
lừa:
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);
Không có giải pháp nào trên trang này phù hợp với tôi, tôi đã trộn chúng và làm cho chúng hoạt động với Windows và Visual Studio 2019, Đây là cách thực hiện:
#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;
}
Kết quả :
2020: 08: 02 06: 41: 59.107
2020: 08: 02 06: 41: 59.196