미국/시카고 시간대(CST6CDT)와 Etc/GMT-6 사이에 차이가 있는 이유는 무엇입니까?

미국/시카고 시간대(CST6CDT)와 Etc/GMT-6 사이에 차이가 있는 이유는 무엇입니까?

이것은 내 코드입니다.

#include <time.h>
#include <stdio.h>

time_t my_timegm (struct tm *tm, char *tz_offset);

int
main (void)
{
  struct tm time_tm;
  time_t start_timet, end_timet;

  time_tm.tm_sec = 0;
  time_tm.tm_min = 0;
  time_tm.tm_hour = 0;
  time_tm.tm_mday = 1;
  time_tm.tm_mon = 0;
  time_tm.tm_year = 2023 - 1900;
  time_tm.tm_isdst = -1;
  start_timet = my_timegm (&time_tm, "Etc/GMT-6");
  printf ("\n%li ", start_timet);
  start_timet = my_timegm (&time_tm, "America/Chicago");
  printf ("\n%li ", start_timet);
}

my_timegm은

#include <time.h>
#include <stdlib.h>

time_t
my_timegm (struct tm *tm, char *tz_offset)
{
  time_t ret;
  char *tz;

  tz = getenv ("TZ");
  setenv ("TZ", tz_offset, 1);
  tzset ();
  ret = mktime (tm);
  if (tz)
    setenv ("TZ", tz, 1);
  else
    unsetenv ("TZ");
  tzset ();
  return ret;
}

출력은 다음과 같습니다

1672509600

1672552800

43200초(12시간)의 차이가 나는 이유는 무엇입니까? 또는 GMT-6이 America/Chicago(UTC-6)와 다른 이유는 무엇입니까?

답변1

POSIX를 비난하십시오.

환경 변수에 대한 POSIX 사양이 TZ처음 만들어졌을 때 양의 시간대 번호가 서반구의 시간대에 할당되었습니다. 왜냐하면 그것이 아마도 다양한 Unix 시스템 개발자들 사이의 기존 관행에서 도달할 수 있는 유일한 합의였을 것이기 때문입니다. 대부분은 또는 모두 당시 미국 본토에 기반을 두고 있었기 때문에 성가신 빼기 기호를 자신의 영역에서 사용하기를 원하지 않았습니다.

기본적으로 TZ=xxx-6시간대 스탬프가 지정되며 xxx현지 시간에서 6시간을 빼면 UTC를 얻을 수 있습니다.

데이터베이스 zoneinfo(한때Olson 시간대 데이터베이스,현재 IANA에서 관리함Etc/GMTxx)은 레거시 호환성을 위해 시간대에 대해 동일한 표기 규칙을 사용합니다.

$ TZ=GMT-6 date              # legacy POSIX
Sun 11 Jun 10:23:18 GMT 2023 # note: GMT is a lie here!
$ TZ=Etc/GMT-6 date          # modern zoneinfo form
Sun 11 Jun 10:23:25 +06 2023

$ TZ=GMT6 date               # legacy POSIX
Sat 10 Jun 22:24:31 GMT 2023 # note: GMT is a lie here!
TZ=Etc/GMT+6 date            # modern zoneinfo form
Sat 10 Jun 22:24:35 -06 2023

이 형식을 사용할 때 zoneinfo타임스탬프( +06또는 -06)와 함께 표시되는 UTC 오프셋은 시간대 이름에 대해 예상하는 것과 반대되는 부호를 갖습니다 zoneinfo.

답변2

"경도를 구해 15로 나누어 오프셋으로 사용하고 싶습니다."

여기에 실수가 있습니다. 이 추론에 따르면 GMT 영역은 0시에서 15시까지 서쪽으로 확장되어야 하고, 다른 영역은 15시에서 30시, 30시에서 45시 등으로 확장되어야 합니다.

그러나 GMT 시간대는 동경 7.5도에서 서경 7.5까지 확장됩니다. 따라서 서쪽의 다음 영역은 7.5w에서 22.5w, 그 다음에는 22.5w에서 37.5w 등입니다.

이는 여러분이 발견한 12시간의 차이를 설명하지는 않지만 필요한 계산에 오류가 있음을 지적합니다.

답변3

방금 글에서 답을 찾았네요날짜 tz는 변환에 GMT를 사용하며 동일한 GMT를 사용하는 도시 이름은 다른 결과를 제공합니다., 이는 GMT-x가 실제로 GMT보다 x시간 빠르다는 것을 나타냅니다. 이것은 내 코드에서 확인되었습니다.

int
main (void)
{
  struct tm time_tm;
  time_t start_timet, end_timet;

  time_tm.tm_sec = 0;
  time_tm.tm_min = 0;
  time_tm.tm_hour = 0;
  time_tm.tm_mday = 1;
  time_tm.tm_mon = 0;
  time_tm.tm_year = 2023 - 1900;
  time_tm.tm_isdst = 0;
  start_timet = my_timegm (&time_tm, "America/Chicago");
  printf ("\n%li ", start_timet);
  time_tm.tm_isdst = 0;
  start_timet = my_timegm (&time_tm, "Etc/GMT+6");
  printf ("\n%li ", start_timet);
}

관련 정보