Ошибка std :: get_time в Visual C++ 2017

Я пытаюсь разобрать простую строку даты и времени с помощью 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;
    }
}

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

user2100815 18.06.2018 23:29
tm data; может не инициализировать все data. Предлагайте нулевое наполнение перед std::get_time(&data,...
chux - Reinstate Monica 18.06.2018 23:34

@chux Я не понимаю, как это может повлиять на запись в структуру tm.

user2100815 18.06.2018 23:35
"20180102 12:24:33" выглядит как год в далеком будущем без месяца и дня. Может быть, `" 2018 01 02 12:24:33 "?
chux - Reinstate Monica 18.06.2018 23:35

@chux Мне кажется, что 2018 01 02 (без пробелов между элементами). И, как я уже отмечал, этот код действительно работает с GCC.

user2100815 18.06.2018 23:36

@NeilButterworth Заполнение data чем-либо может помочь при отладке в определении того, что было написано с помощью get_time().

chux - Reinstate Monica 18.06.2018 23:38

@ Нил Верно. Я явно просил Visual C++, так как кода, который работает на LInux, нет в WIndows ... и, к сожалению, он мне нужен в Windows.

Abruzzo Forte e Gentile 18.06.2018 23:39

.. так какой смысл использовать строку форматирования "% Y% m% d", если тогда мне нужно изменить строку ввода? Я сомневаюсь, что мне что-то не хватает при использовании этой функции. Я взглянул на std :: time_get :: get_date и фасеты, но кажется довольно сложным (мне нужно немного, чтобы это переварить)

Abruzzo Forte e Gentile 18.06.2018 23:42

@AbruzzoForteeGentile Пометка этого сообщения как Visual C++ (компилятор) более полезна, чем тегирование как Windows (ОС).

chux - Reinstate Monica 18.06.2018 23:42

У меня работает с VS 2015. У меня нет VS 2017.

user2100815 18.06.2018 23:43

@chux правильно: тег обновлен

Abruzzo Forte e Gentile 18.06.2018 23:47

@Neil образец кода печатает success в моем VS2017, однако последующий std::cout << data.tm_mon << " " << data.tm_mday; печатает -858993460 -858993460

lukeg 18.06.2018 23:48

@lukeg Что ж, мы можем отвечать только на вопросы о том, что спрашивает ОП. Он сказал, что fail () возвращает истину.

user2100815 18.06.2018 23:49

вероятно родственное - MSConnect 3093410 | C++ std :: get_time не разбирается правильно. Также cppreference заявляет, что перед вызовом этой функции рекомендуется инициализировать tm.

user7860670 18.06.2018 23:49

«Когда я отлаживаю, я вижу, что правильно анализируются только часы, минуты и секунды, но не все остальное». -> что ты видишь в остальном?

chux - Reinstate Monica 18.06.2018 23:51

tm_year = -85000, tm_month = -85000, tm_day = -850000 .. все остальные поля установлены на его значение (у меня нет точного значения с собой, и я не могу получить доступ к своему Win Pc, к сожалению)

Abruzzo Forte e Gentile 18.06.2018 23:53

@AbruzzoForteeGentile в неинициализированной отладочной сборке data заполняется шаблоном 0xCC, который производит значение -858993460 (мусор).

user7860670 18.06.2018 23:57

..Хорошо, мне нужно еще раз попытаться инициализировать tm data = {0}

Abruzzo Forte e Gentile 19.06.2018 00:05

@AbruzzoForteeGentile Разумеется, синтаксический анализ неправильный из-за упакованных "%Y%m%d" и "20180102". Это может быть связано с неправильной реализацией get_time() или слабой спецификацией. Я подозреваю, что и то, и другое. Попробуйте работать с одним или двумя спецификаторами одновременно, чтобы сузить причину.

chux - Reinstate Monica 19.06.2018 00:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
19
527
0

Другие вопросы по теме