Работа с летним временем

Учитывая введенную дату и время (в строковом формате), я пытаюсь получить время эпохи для него, используя time функции даны в ctime лайк mktime, Преобразование time_t Время эпохи назад к дате и времени приводит к дате и времени, которые на один час меньше, чем оригинал. Я прошел через некоторые обсуждения, в которых говорится, что в случае перехода на летнее время может быть установлен один час. Вот код:

//sample strptime program.

#include <iostream>
#include <ctime>
#include <string>
using namespace std;

long parseTime(string time) {

cout << "Time entered = " << time << endl;

long timeSinceEpoch;

struct tm t;

if(time.find("/") != string::npos) {
//format of date is mm/dd/yyyy. followed by clock in hh:mm (24 hour clock).
if(strptime(time.c_str(), "%m/%e/%Y %H:%M", &t) == NULL) {
cout << "Error. Check string for formatting." << endl;
}
} else if(time.find("-") != string::npos) {
//format of date is yyyy-mm-dd hh:mm:ss (hh in 24 hour clock format).
cout << "I am here." << endl;
if(strptime(time.c_str(), "%Y-%m-%e %H:%M:%S", &t) == NULL) {
cout << "Error. Check string for formatting of new date." << endl;
}
}

cout << "Details of the time structure:" << endl;
cout << "Years since 1900 = " << t.tm_year << endl;
cout << "Months since January = " << t.tm_mon << endl;
cout << "Day of the month = " << t.tm_mday << endl;
cout << "Hour = " << t.tm_hour << " Minute = " << t.tm_min << " second = " << t.tm_sec << endl;

timeSinceEpoch = mktime(&t);
time_t temp = mktime(&t);
cout << "Time since epoch = " << timeSinceEpoch << endl;

cout << "Reconverting to the time structure:" << endl;
struct tm* t2 = localtime(&temp);
cout << "Details of the time structure:" << endl;
cout << "Years since 1900 = " << t2->tm_year << endl;
cout << "Months since January = " << t2->tm_mon << endl;
cout << "Day of the month = " << t2->tm_mday << endl;
cout << "Hour = " << t2->tm_hour << " Minute = " << t2->tm_min << " second = " << t2->tm_sec << endl;

return timeSinceEpoch;
}

int main(int argc, char *argv[]) {

string date, t;
cout << "Enter date: " << endl;
cin >> date;
cout << "Enter time: " << endl;
cin >> t;

struct tm time;
string overall = date + " " + t;

long result = parseTime(overall);
cout << "Time in date + time = " << overall << " and since epoch = " << result << endl;

return 0;
}

Проблемный вход:
дата: 2013-03-11
время: 04:41:53

Мои вопросы
1. Проверка на tm_idst flag возвращает ненулевое значение, указывающее, что DST действует. Однако, как я узнаю, о каком часовом поясе идет речь?
2. Указанная выше временная метка, возможно, не была записана в том же часовом поясе, где я нахожусь. Есть ли способ указать часовой пояс так, чтобы tm_idst флаги правильно установлены?
3. Как мне обращаться с летним временем, когда я не уверен, в каком часовом поясе была записана временная метка?

2

Решение

гладкий C++ довольно мало данных о часовом поясе, и без указания часового пояса для времени, которое нужно отформатировать, есть несколько периодов, когда вы получите противоречивый результат — например, повторное время после часов, возвращающихся. Вот почему всегда рекомендуется записывать все временные метки в UTC — т.е. никогда применить часовой пояс к записанной временной отметке, записать его в GMT, а затем туда-сюда с этим значением в качестве отображаемой переменной, которую вы полностью контролируете.

В Linux / BSD есть несколько дополнительных полей, которые можно использовать для определения часового пояса и смещения от UTC — например, на Linux это __tm_gmtoff поле, а в BSD (/ Mac OS X) это называется tm_gmtoff,

Существует дополнительное поле с обозначением часового пояса, которое __tm_zone на Linux и tm_zone в BSD (/ Mac OS X), но это поле заполняется только когда вы получаете местное время.

Я немного изменил ваш пример и получил следующий вывод:

Time entered = 2013-04-05 15:00
I am here.
Error. Check string for formatting of new date.
Details of the time structure:
Years since 1900 = 113
Months since January = 3
Day of the month = 5
Hour = 15 Minute = 0 second = 0
gmtoff = 0
Time since epoch = 1365174000
Reconverting to the time structure:
Details of the time structure:
Years since 1900 = 113
Months since January = 3
Day of the month = 5
Hour = 16 Minute = 0 second = 0
gmtoff = 3600
Zone = IST
Time in date + time = 2013-04-05 15:00 and since epoch = 1365174000

Если вы используете эту структуру в Windows, вам придется использовать другой механизм, поскольку он не имеет этих двух дополнительных полей.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]