시간값을 인쇄 가능한 형식으로 구조화
포맷하는 것을 도와주시겠습니까?struct timeval
"2010-01-01 15:35:10.0001"과 같이 사람이 읽을 수 있는 형식의 예?
마이크로초 부분은 에 없으므로 수동으로 추가해야 합니다.struct tm
그것()을 다루고 있습니다.다음은 토막글입니다.
struct timeval tv;
time_t nowtime;
struct tm *nowtm;
char tmbuf[64], buf[64];
gettimeofday(&tv, NULL);
nowtime = tv.tv_sec;
nowtm = localtime(&nowtime);
strftime(tmbuf, sizeof tmbuf, "%Y-%m-%d %H:%M:%S", nowtm);
snprintf(buf, sizeof buf, "%s.%06ld", tmbuf, tv.tv_usec);
다음과 같은 명확한 정밀도를 사용하는 방법을 주목하십시오.06
0으로 채워진 마이크로초 필드를 가져옵니다.마이크로초는 0에서 999,999 사이이므로 항상 6자리로 패딩해야 합니다.예를 들어 57마이크로초를 570,000으로 잘못 표현하고 싶지 않습니다("1.57"과 "1.000057"을 비교).
변환합니다.tv_sec
사용.localtime
,그리고.strftime
, 그다음에 덧붙이기tv_usec
일부.
이전 답변과 설명을 결합하고 RFC3339와 호환되도록 형식을 변경하고 모든 오류 조건을 확인하면 다음과 같은 이점을 얻을 수 있습니다.
#include <stdio.h>
#include <sys/time.h>
ssize_t format_timeval(struct timeval *tv, char *buf, size_t sz)
{
ssize_t written = -1;
struct tm *gm = gmtime(&tv->tv_sec);
if (gm)
{
written = (ssize_t)strftime(buf, sz, "%Y-%m-%dT%H:%M:%S", gm);
if ((written > 0) && ((size_t)written < sz))
{
int w = snprintf(buf+written, sz-(size_t)written, ".%06dZ", tv->tv_usec);
written = (w > 0) ? written + w : -1;
}
}
return written;
}
int main() {
struct timeval tv;
char buf[28];
if (gettimeofday(&tv, NULL) != 0) {
perror("gettimeofday");
return 1;
}
if (format_timeval(&tv, buf, sizeof(buf)) > 0) {
printf("%s\n", buf);
// sample output:
// 2015-05-09T04:18:42.514551Z
}
return 0;
}
ctime((const time_t *) &timeval.ts.tv_sec)
참고로 이 코드를 찾으시는 것 같습니다.
strpm 함수를 사용하여 날짜와 시간을 문자열로 변환할 수 있습니다.
전역 함수를 쓸 경우 일부 문제가 발생할 수 있으므로 localtime_s 대신 localtime_s를 사용하여 tv_sec을 변환합니다.함수가 다중 threaded 솔루션에서 작동하는 경우 localtime_r을 사용하는 것을 고려하십시오.
이것이 제가 사용하는 것입니다.
#include <time.h>
#include <string.h>
#ifdef _WIN32
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#define gmtime_r(ptime,ptm) (gmtime_s((ptm),(ptime)), (ptm))
#else
#include <sys/time.h>
#endif
#define ISO8601_LEN (sizeof "1970-01-01T23:59:59.123456Z")
char *timeval_to_str(char iso8601[restrict static ISO8601_LEN], unsigned precision, const struct timeval * restrict tv) {
struct tm tm;
if (!gmtime_r(&tv->tv_sec, &tm))
return memcpy(iso8601, "Error: Year overflow", sizeof "Error: Year overflow");
tm.tm_year %= 10*1000;
char *frac = iso8601 + strftime(iso8601, sizeof "1970-01-01T23:59:59.", "%Y-%m-%dT%H:%M:%SZ", &tm);
if (precision) {
unsigned long usecs = tv->tv_usec;
for (int i = precision; i < 6; i++) usecs /= 10;
char *spaces = frac + sprintf(frac - 1, ".%-*luZ", precision, usecs) - 3;
if (spaces > frac) while (*spaces == ' ') *spaces-- = '0';
}
return iso8601;
}
precision
초 분율의 너비를 지정합니다.코드는 y10k- 그리고 y입니다.INT_MAX
-내력이 있는
언급URL : https://stackoverflow.com/questions/2408976/struct-timeval-to-printable-format
'programing' 카테고리의 다른 글
모듈을 가져왔는지 확인하려면 어떻게 해야 합니까? (0) | 2023.10.02 |
---|---|
워드프레스 플러그인 페이지에 드래그 가능한 섹션 추가 (0) | 2023.10.02 |
자바에서 줄을 새로 추가하는 문자열을 인쇄하려면 어떻게 해야 합니까? (0) | 2023.10.02 |
jquery에서 href를 업데이트(첨부)하는 방법? (0) | 2023.10.02 |
PowerShell에 경과 시간 표시 (0) | 2023.10.02 |