struct timeval
인스턴스를 "2010-01-01 15 : 35 : 10.0001"과 같이 사람이 읽을 수있는 형식으로 포맷하는 방법을 알려주십시오.인쇄 가능한 형식의 구조 timeval
답변
및 strftime
을 사용하여 변환 한 다음 tv_usec
부분을 추가하십시오.
strftime 함수를 사용하여 날짜와 시간을 문자열로 변환 할 수 있습니다.
strftime
()가 다루는 struct tm
에 있지 않으므로 수동으로 마이크로 초 부분을 추가해야합니다. 우리가 제로 채워진 마이크로 필드를 얻을 수 06
의 명시적인 정밀도를 사용하는 방법
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);
참고 : 여기에 조각입니다. 마이크로 초는 0에서 999,999까지이므로 항상 6 자리로 채워야합니다. 예를 들어 57 마이크로 초를 570,000으로 나타냅니다 ("1.57"vs "1.000057"비교).
이것은 strftime (반환 바이트 수를 반환)의 반환 값을 저장하고 snprintf로 전달할 수있는 동일한 버퍼에 인덱스하기 위해 사용함으로써보다 효율적으로 수행 될 수 있습니다. 이것은 하나의 버퍼를 사용하고 strftime()에서 문자열의 추가 사본을 피할 것이다. –
매우 유용한 답과 일반적으로이 모든 스레드. 마지막 줄에서'', % s. % 06ld "'를 지정하는 것이 더 나을 것입니다. 감사합니다. – lrleon
경고 : 형식 '% d'은 'int'형식의 인수를 필요로하지만 인수 5는 마지막 줄에서 '__suseconds_t {일명 long int}'[-Wformat =] 형식을 가지고 있습니다. ? – bakalolo
ctime((const time_t *) &timeval.ts.tv_sec)
나는이 코드를 찾고 있다고 생각합니다.
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;
}
대신의 현지의 localtime_s를 사용하여 tv_sec가 변환, 당신이 만약 때문에 전역 함수를 작성 중이므로 문제가 발생할 수 있습니다. 함수는 다중 스레드 솔루션에서 작동 할 수있는 경우 다음이 내가 무엇을 사용 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
입니다.
- 1. JQuery : 최신 형식의 인쇄 가능한 문서?
- 2. UNIX 프로그래밍. struct timeval 인쇄 방법 (C 프로그래밍)
- 3. 문자열에 timeval (두 사이의 변환)
- 4. 검색 가능한 힙 구조
- 5. 트리 형식의 웹 사이트 구조?
- 6. symfony에서 인쇄 가능한 버전
- 7. Symbian의 인쇄 가능한 문자
- 8. HTML을 인쇄 가능한 형식으로
- 9. 자바에서 인쇄 가능한 문자
- 10. C++ 설정 timeval 멤버
- 11. 인쇄 JSP 페이지에서 "트리"구조
- 12. 인쇄 가능한 파일에 html로보고하는 방법
- 13. 은 가능한 인쇄 파일 동작
- 14. HTMLDocument를 인쇄 가능한 문자열로 변환
- 15. 모든 가능한 세계 구성 인쇄
- 16. 인쇄 미리보기 PDF 형식의 SSRS 보고서
- 17. jQuery에는 해시 테이블 형식의 변경 가능한 데이터 구조가 있습니까?
- 18. Java로 인쇄 가능한 (및 저장 가능한) 양식을 생성하는 방법은 무엇입니까?
- 19. 대용량의 쿼리 가능하고 트래버스 가능한 데이터 구조
- 20. Java에서 정렬 가능한 HashMap과 같은 데이터 구조?
- 21. 인쇄 가능한 보고서를 만들기 위해 아이디어를 제안하십시오
- 22. .Net에서 인쇄 가능한 HMAC 공유 키 생성
- 23. C# 인쇄 화면 스크롤 가능한 컨트롤
- 24. 목록의 가능한 모든 하위 집합 인쇄
- 25. 이 인쇄 가능한 방법에있어 문제점은 무엇입니까?
- 26. 인쇄 가능한 보고서에 HTML 컨텐트 서식 지정
- 27. Bazaar 로그를 인쇄 가능한 형식으로 내보내시겠습니까?
- 28. SWF에서 인쇄 가능한 이미지를 렌더링하는 방법
- 29. 전화 번호부에 인쇄 가능한 출력을 생성하는 방법
- 30. 인쇄 가능한 결과가있는 jQuery 폼 마법사
중복 된 http://stackoverflow.com/questions/1469495/unix-programming-struct-timeval-how-to-print-it-c-programming? –
dup이 아니기 때문에 사람이 읽을 수있는 형식을 지정하고 stftime을 가리키며 다른 하나는 초와 useconds 만 추출합니다. –