나는 날짜/시간에 대한 무거운 산술을 포함하여 시간 관리를 위해 mktime/localtime을 사용 해왔다.부정적인 초를 지닌 이상한 mktime 논리
mktime에 음수 값이 들어있는 struct tm을 제공 할 때 매우 이상한 것으로 나타났습니다.
아래 코드를 사용하십시오. 2013 년 11 월 3 일에 LA에 DST 변경 사항이있었습니다. 2013-11-04 자정으로 시간을 지정하고 24 시간을 빼면 2013-11-03 자정까지 동일한 값을 얻습니다. 그것은 UTC 방식으로 25 시간 차이가 있습니다. isdst = -1에서와 같이, 우리는 '벽시계'를보고 있다고 말할 수 있습니다. 내가 1440 분 (24 * 60)을 뺀 것과 같습니다. 그러나 86400 (24 * 60 * 60) 초를 빼면 2013-11-03 오전 1 시가됩니다. 그것은 UTC 방식으로 24 시간 차이가 있습니다. - 왜 초 분, 시간, 일보다 다르게 취급하는 것이 이해가되지 않습니다 나를 위해
2013-11-03 00:00:00 (gmtoff=0, isdst=-1) -> 2013-11-03 00:00:00 (gmtoff=-25200, isdst=1) -> 1383462000
2013-12--27 00:00:00 (gmtoff=0, isdst=-1) -> 2013-11-03 00:00:00 (gmtoff=-25200, isdst=1) -> 1383462000
2013-11-04 -24:00:00 (gmtoff=0, isdst=-1) -> 2013-11-03 00:00:00 (gmtoff=-25200, isdst=1) -> 1383462000
2013-11-04 00:-1440:00 (gmtoff=0, isdst=-1) -> 2013-11-03 00:00:00 (gmtoff=-25200, isdst=1) -> 1383462000
2013-11-04 00:00:-86400 (gmtoff=0, isdst=-1) -> 2013-11-03 01:00:00 (gmtoff=-25200, isdst=1) -> 1383465600
: 여기에 아래 코드의 출력은입니까? 나는 사람과 C 표준을 보았지만 아무것도 찾을 수 없었다.
이 동작으로 인해 내 가정이 손상되고 여러 가지 문제가 발생합니다. 누군가 mktime/localtime에 대한 좋은 대안을 알고 있습니까 (ICU 및 tzcode를 테스트 한 결과 내가 필요로하는 것에 너무 느리다). 어떤 생각에 미리
감사합니다 :)
#include <time.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char* printtm(struct tm tm)
{
static char buf[100];
sprintf(buf, "%04d-%02d-%02d %02d:%02d:%02d (gmtoff=%ld, isdst=%d)",
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,
tm.tm_hour, tm.tm_min, tm.tm_sec,
tm.tm_gmtoff, tm.tm_isdst);
return buf;
}
void test(int y, int m, int d, int hh, int mm, int ss, int isdst)
{
struct tm tm;
memset(&tm, 0, sizeof(tm));
tm.tm_year = y - 1900;
tm.tm_mon = m - 1;
tm.tm_mday = d;
tm.tm_hour = hh;
tm.tm_min = mm;
tm.tm_sec = ss;
tm.tm_isdst = isdst;
printf("%s -> ", printtm(tm));
time_t t = mktime(&tm);
printf("%s -> %ld\n", printtm(tm), t);
}
int main()
{
setenv("TZ", ":America/Los_Angeles", 1);
tzset();
test(2013,11,03, 0,0,0, -1);
test(2013,12,-27, 0,0,0, -1);
test(2013,11,04, -24,0,0, -1);
test(2013,11,04, 0,-1440,0, -1);
test(2013,11,04, 0,0,-86400, -1);
return 0;
}
@hobbs : 예, 있습니다. C11 7.27.2.3은'mktime' 함수를 설명합니다 : "구조의 **'tm_wday' ** 및 **'tm_yday ** ** 구성 요소의 원래 값은 무시되고 다른 구성 요소의 원래 값은 무시됩니다 위에 표시된 범위로 제한됩니다. " (그리고 방금 회신했던 설명을 삭제했습니다.) –
Thanks Keith. 우선, 나는 어떤 코멘트도 삭제하지 않았고 어떤 일이 일어 났는지 전혀 모른다. 어쨌든, 나는 wday/yday에 대해 알았지 만, 당신의 대답은 초가 왜 여기에 다르게 취급되는지 분명히하지 않습니다. –
누군가 "hobbs"라는 사람이 의견을 게시 한 후 내 답장을 쓰면서 누군가 삭제했습니다. 나는 아직도 관련성이 있다고 보였으므로 회신을 제자리에 두었다. 당신 말이 맞습니다. 초가 다르게 대하는 이유를 분명히하지 않았기 때문에 대답이 아닌 논평을 게시했습니다. 나는 나중에 자세히 살펴볼지도 모른다. –