У меня есть функция, которую я написал (если есть хороший стандарт замена, пожалуйста, дайте мне знать ...)Преобразования в Отметку времени Unix некорректной
time_t get_unix_time(string time_str) {
time_t loctime;
time(&loctime);
struct tm *given_time;
time_str = time_str.substr(0, time_str.find_first_of('.'));
replace(time_str.begin(), time_str.end(), ':', ',');
replace(time_str.begin(), time_str.end(), '-', ',');
replace(time_str.begin(), time_str.end(), '/', ',');
replace(time_str.begin(), time_str.end(), ' ', ',');
given_time = localtime(&loctime);
vector<string> trecord = split_string(time_str, ',');
given_time->tm_year = atoi(trecord.at(0).c_str()) - 1900;
given_time->tm_mon = atoi(trecord.at(1).c_str()) - 1;
given_time->tm_mday = atoi(trecord.at(2).c_str());
given_time->tm_hour = atoi(trecord.at(3).c_str());
given_time->tm_min = atoi(trecord.at(4).c_str());
given_time->tm_sec = atoi(trecord.at(5).c_str());
return mktime(given_time);
}
входа (time_str), чтобы функция из формат 1970-01-01 00: 00: 00.0. Функция split_string() разбивает строку time_str
в вектор, содержащий:
{1970, 01, 01, 00, 00, 00}
, который используется для заполнения в структуре given_time.
Я написал функцию для ее проверки и передал именно этот вход (начало эпохи). Тем не менее, время, которое он мне возвращает, составляет 21600, то есть 1970-01-01 06:00:00, или UTC + 6. Ожидаемый результат: (начало эпохи).
Примечание: что я нахожусь в центральном часовом поясе США, который является UTC - 6. В полночь 1 января 1970 года КНТ, время @ UTC будет 1 января 1970 года 06:00:00.
Есть ли что-нибудь в моей функции, что делает его конкретным для моего часового пояса? Я делаю что-то неправильно в этой функции, или могу ли я сделать что-то другое, чтобы сделать его независимым от зоны или, по крайней мере, всегда UTC.
Кроме того, я не могу использовать библиотеку boost или любые другие дополнительные библиотеки. Я могу использовать только стандартные материалы на C++. – Sagar
Обработка часового пояса в C++-библиотеке довольно некрасива. Если вы запустили свою программу с переменной окружения 'TZ', установленной в значение' UTC', этот фрагмент кода будет работать. – Omnifarious
mktime интерпретирует данное время как местное время. Поэтому, если вы дадите 1970-01-01 00:00:00, это будет в ваше местное время, поэтому mktime вернет время UTC-0, то есть 1970-01-01 06:00:00 – Robert