Как создать время UTC в C для определенного дня, месяца и года?

StackOverflow https://stackoverflow.com/questions/1131625

  •  16-09-2019
  •  | 
  •  

Вопрос

Как создать время UTC в C для следующей даты:

1 июля 2038 г.

используя стандартные вызовы функций ANSI C (учитывая, что элемент tm_year структуры tm не может быть больше 137)?

Это было полезно?

Решение

Вы не знаете.32-битный ANSI C time_t переносится в 2038 году.Это все равно, что спросить, как создать дату 23 июля 2003 года в старой системе COBOL, состоящей из двух цифр.

Другие советы

Другие отметили, что конкретная дата, которую вы приводите в качестве примера, выходит за рамки максимальной даты/времени, представленной 32-битным time_t, часто называемым 2038 год проблема.Одним из решений является использование 64-битного time_t, что делают некоторые 64-битные системы POSIX (linux amd64), и вызов mktime.

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

int main(void)
{
        struct tm future;       /* as in future date */
        time_t t;

        future.tm_sec = 0;
        future.tm_min = 0;
        future.tm_hour = 0;
        future.tm_mday = 1;     /* 1st */
        future.tm_mon = 6;      /* July */
        future.tm_year = 2038 - 1900; /* 2038 in years since 1900 */
        future.tm_isdst = 0;          /* Daylight Saving not in affect (UTC) */
#ifdef _BSD_SOURCE
        future.tm_zone = "UTC";
#endif

        t = mktime( &future );
        if ( -1 == t ) {
                printf("Error converting 1 July 2038 to time_t time since Epoch\n");
                return EXIT_FAILURE;
        }

        printf("UTC time and date: %s\n", asctime( &future ) );

        return EXIT_SUCCESS;
}

Вы можете попробовать, используя следующий пример:

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


int main(void)
{
  struct tm *local;
  time_t t;

  t = time(NULL);
  local = localtime(&t);
  printf("Local time and date: %s\n", asctime(local));
  local = gmtime(&t);
  printf("UTC time and date: %s\n", asctime(local));

  return 0;
}

Это должно дать вам ожидаемый результат.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top