Преобразование исторического времени в GMT

Мне нужно преобразовать несколько строк в формате «2011061411322100» в GMT – моя первая попытка ниже. Однако проблема в том, что время идет с другого ПК и является историческим временем. Таким образом, я не получаю время в реальном времени, поэтому я не могу просто получить GMT по местному времени в поле, в котором работает мой код.

Проблема в том, что если мой код работает во время изменения времени, изменение времени будет происходить в моем поле, но не в удаленном поле, где я получаю время. Однако я могу запросить окно, чтобы получить текущее время в любое время.

Итак, чтобы дать более подробную информацию:

  1. Я начинаю работу в удаленной коробке
  2. Задание завершено
  3. Я получаю несколько раз, связанных с работой
  4. Я конвертирую время в GMT

Если изменение времени (переход на летнее время) происходит между 1. и 2. Я ввернута. Мое переключение GMT ​​будет нарушено. Я думаю, после 2) мне нужно получить текущее время удаленного ящика и посмотреть, есть ли разница> 58 минут, а затем применить это к конверсии. Но я не могу найти надежный способ сделать это.


string GMTConverter::strToGMT(const string& timeToConvert) { // Set time zone from TZ environment variable. _tzset(); struct tm tmTime; //2011 06 14 11 32 21 00 // (strToInt is just a wrapper for atoi) int year = strToint(timeToConvert.substr(0, 4) ); int month = strToint(timeToConvert.substr(4, 2) ); int day = strToint(timeToConvert.substr(6, 2) ); int hour = strToint(timeToConvert.substr(8, 2) ); int min = strToint(timeToConvert.substr(10, 2) ); int sec = strToint(timeToConvert.substr(12, 2) ); cout<<"Time after parsing: "<<year<<"/"<<month<<"/"<<day<<" "<<hour<<":"<<min<<":"<<sec<<endl; // add to tm struct and return tmTime.tm_hour = hour; tmTime.tm_min = min; tmTime.tm_sec = sec; tmTime.tm_mday = day; tmTime.tm_mon = (month-1); tmTime.tm_year = (year - 1900); cout <<"Time in TM: "<<tmTime.tm_year<<"/"<<tmTime.tm_mon<<"/"<<tmTime.tm_mday<<" "<<tmTime.tm_hour<<":"<<tmTime.tm_min<<":"<<tmTime.tm_sec<<endl; char currDateTime[64]; // For logging strftime(currDateTime, 63, "%c", &tmTime); cout <<"Actual time:"<<currDateTime<<endl; time_t remotePCTime = mktime( &tmTime ); struct tm *gmt = gmtime( &remotePCTime ); cout << "gmt = " << asctime( gmt ) << endl; char datebuf_2[12]; char timebuf_2[13]; strftime( datebuf_2, 13, "%Y-%m-%d\0", gmt ); strftime( timebuf_2, 13, "%H:%M:%S\0", gmt ); return string(datebuf_2) + "T" + string(timebuf_2) + "." + string("000"); } 

    Очевидным надежным решением было бы использовать UTC (который не имеет летнего времени) для отметки времени, которую вы отправляете. Используя любую систему времени, которая имеет присущую двусмысленность (есть один час перекрытия каждый год, когда вы можете получать одинаковые штампы времени в другое время), будет невозможно иметь надежный метод, поскольку информация теряется.

    Если вы не контролируете формат времени, который отправляет удаленный компьютер, вы можете только попытаться экстраполировать информацию, которую у вас есть, например, если время окончания меньше, чем время начала, добавьте один час. Это снова вводит двусмысленность, если работа заняла более одного часа, но по крайней мере время не будет двигаться назад.

    Изменение времени появляется два раза в год – почему вы должны беспокоиться? В любом случае, вы не можете изменить формат времени, чтобы включить событие изменения времени? Или проверить, выполняется ли задание во время изменения времени, сравнивая с определенным фиксированным временем и датой, когда появляется изменение времени?

    Получите местное время в UTC в начале и в конце удаленного задания. Получите дистанционное рабочее время и скрытый до UTC в начале и в конце задания. Преобразуйте коллекцию «исторических» времен в GMT / UTC, как указано в вашем исходном сообщении. Храните эти данные в структуре или classе и дайте дополнительные начальные конечные значения четкому имени, например LocalDLSValidation и т. Д. Теперь мы должны проверить следующие сценарии:

      1. Start and end time delta between Local and Remote is within allowed threshold(50mins?) 

    Это золотой случай. Никакая модификация не требуется для нашей коллекции исторических времен

      2. Local start/end time and remote time delta is outside threshold. 

    Это второй простейший случай. Это означает, что мы можем + или – час до нашей всей коллекции раз.

      3.Local start time and remote time delta is within threshold. But end is outside. 

    Это наш худший сценарий, поскольку это означает, что изменения произошли в середине нашей работы. Если работа длится меньше часа, тогда будет легко увидеть, какие времена в нашей коллекции должны быть + или – один час.

    Если он больше 1 часа …. ммммм. Здесь мы сталкиваемся с проблемами.

      4. Start time between local and remote is different but end time is different 

    Согласно варианту использования в OP это не должно происходить.