Считайте это чем-то вроде продолжения до этого вопроса . По сути, средства форматирования даты / времени в C ++ кажутся безнадежно сломанными - настолько, что для того, чтобы сделать что-то столь же простое, как преобразование строки даты / времени в объект, вам действительно нужно прибегнуть либо к Boost.Datetime, либо к старому доброму C strftime
/ strptime
объектов.
Проблема заключается в том, что ни одно из этих решений не работает напрямую с настройками языкового стандарта C ++, вставленными в конкретный объект iostream. Средства C используют глобальные настройки языкового стандарта C / POSIX, тогда как средства ввода-вывода в Boost.Datetime, похоже, полностью игнорируют настройки языкового стандарта iostream, позволяя пользователю напрямую задавать названия месяцев, дней недели и т. Д. Независимо от языкового стандарта.
Итак, я хотел что-то, что соответствовало бы настройкам локали, вставленной в определенный поток ввода / вывода, что позволило бы мне преобразовать строку в struct tm
. Это казалось достаточно легким, но я сталкивался с препятствиями на каждом углу. Сначала я заметил, что некоторые реализации STL предоставляют нестандартную функцию std::time_get::get
, поэтому я решил реализовать нечто подобное. По сути, я просто перебрал бы строку формата и всякий раз, когда я нажимал на флаг формата, я использовал одно из средств time_get (например, get_monthname, get_weekday, get_year и т. Д.) Для преобразования входной строки в struct tm
. Это кажется достаточно простым, за исключением того, что каждая из этих функций требует точного диапазона итератора. Вы не можете конвертировать "Monday,"
, это должно быть точно "Monday"
, иначе конвертация не удалась. Поскольку итераторы должны быть istreambuf_iterator
, вы не можете просто сканировать заранее, потому что каждый шаг меняет позицию получения в буфере потока. Таким образом, в основном вы должны сначала выполнить итерацию по потоку, копируя каждый символ в другой потоковый буфер, а затем, когда вы нажимаете разделитель (например, пробел или запятую), используйте второй потоковый буфер со средствами time_get. Буквально, как будто дизайнеры C ++ старались изо всех сил сделать это настолько раздражающим, насколько это возможно.
Итак, есть ли более простое решение? Что делает большинство программистов на C ++, когда им нужно преобразовать строку даты / времени в объект? Должны ли мы просто использовать средства C и потерять преимущества, которые приходят вместе с различными настройками локали, наделенными различными объектами iostream?