Я пытаюсь разобрать простую строку даты и времени с помощью std::get_time в Windows, но это не работает, и я не знаю почему.
Когда я отлаживаю, я вижу, что правильно анализируются только часы, минуты и секунды, но не все остальное.
Вызов str_stream.fail () всегда возвращает истину.
Я бы хотел избежать использования boost::date_time и попытаться решить эту проблему.
Читая подробности из справочника, может быть, это как-то связано с std :: locale std::time_get facets? Если да, то как это правильно установить?
Я хотел бы разобрать эту дату и время как UTC.
Я использую Visual C++ 2017 под Windows 10.
#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <ctime>
int main() {
std::string tmp("20180102 12:24:33");
std::stringstream str_stream(tmp);
tm data;
str_stream >> std::get_time(&data, "%Y%m%d %H:%M:%S");
if (str_stream.fail()) {
std::cout << "failed" << std::endl;
}
else {
std::cout << "success" << std::endl;
}
}
tm data; может не инициализировать все data. Предлагайте нулевое наполнение перед std::get_time(&data,...@chux Я не понимаю, как это может повлиять на запись в структуру tm.
"20180102 12:24:33" выглядит как год в далеком будущем без месяца и дня. Может быть, `" 2018 01 02 12:24:33 "?
@chux Мне кажется, что 2018 01 02 (без пробелов между элементами). И, как я уже отмечал, этот код действительно работает с GCC.
@NeilButterworth Заполнение data чем-либо может помочь при отладке в определении того, что было написано с помощью get_time().
@ Нил Верно. Я явно просил Visual C++, так как кода, который работает на LInux, нет в WIndows ... и, к сожалению, он мне нужен в Windows.
.. так какой смысл использовать строку форматирования "% Y% m% d", если тогда мне нужно изменить строку ввода? Я сомневаюсь, что мне что-то не хватает при использовании этой функции. Я взглянул на std :: time_get :: get_date и фасеты, но кажется довольно сложным (мне нужно немного, чтобы это переварить)
@AbruzzoForteeGentile Пометка этого сообщения как Visual C++ (компилятор) более полезна, чем тегирование как Windows (ОС).
У меня работает с VS 2015. У меня нет VS 2017.
@chux правильно: тег обновлен
@Neil образец кода печатает success в моем VS2017, однако последующий std::cout << data.tm_mon << " " << data.tm_mday; печатает -858993460 -858993460
@lukeg Что ж, мы можем отвечать только на вопросы о том, что спрашивает ОП. Он сказал, что fail () возвращает истину.
вероятно родственное - MSConnect 3093410 | C++ std :: get_time не разбирается правильно. Также cppreference заявляет, что перед вызовом этой функции рекомендуется инициализировать tm.
«Когда я отлаживаю, я вижу, что правильно анализируются только часы, минуты и секунды, но не все остальное». -> что ты видишь в остальном?
tm_year = -85000, tm_month = -85000, tm_day = -850000 .. все остальные поля установлены на его значение (у меня нет точного значения с собой, и я не могу получить доступ к своему Win Pc, к сожалению)
@AbruzzoForteeGentile в неинициализированной отладочной сборке data заполняется шаблоном 0xCC, который производит значение -858993460 (мусор).
..Хорошо, мне нужно еще раз попытаться инициализировать tm data = {0}
@AbruzzoForteeGentile Разумеется, синтаксический анализ неправильный из-за упакованных "%Y%m%d" и "20180102". Это может быть связано с неправильной реализацией get_time() или слабой спецификацией. Я подозреваю, что и то, и другое. Попробуйте работать с одним или двумя спецификаторами одновременно, чтобы сузить причину.





Добавлен компилируемый пример. Это работает с GCC 7.2.0