Intereting Posts
Как найти размер размера строки кеша L1 с измерениями времени ввода-вывода? Можно ли использовать std :: current_exception во время разматывания стека? Использование offsetof () для получения объекта-владельца из переменной-члена Что происходит с RAM, Harddrive, Stack and Heap в C ++? Qt для разработчиков Delphi Любой способ иметь функцию шаблона в абстрактном базовом classе? Какая база была бы более подходящей для моей библиотеки BigInteger? Win32 – Добавление текста в элемент управления редактирования Пытаясь создать программу, которая читает .txt-файл, отображает его, подсчитывает уникальные слова и отображает уникальные слова рядом с тем, сколько раз использовалось. C ++ Не удается подключиться к PostgreSQL с помощью C ++ Почему Windres сообщает о синтаксической ошибке в моей инструкции GROUPBOX? Поиск вращения между двумя конгруэнтными треугольниками Как выглядит скомпилированный class C ++? Как выполнить преобразование RGB-> YUV в C / C ++? Включает ли std :: vector :: insert () недействительные iteratorы, если у вектора достаточно места (созданного с помощью резервной копии)?

Преобразование исторического времени в 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 это не должно происходить.