Считайте это своего рода продолжением этого вопроса . По сути, средства форматирования даты / времени C ++ кажутся безнадежно сломанными - настолько, что для того, чтобы сделать что-то столь же простое, как преобразование строки даты / времени в объект, вам действительно нужно прибегнуть либо к Boost.Datetime, либо к старому доброму C _1 _ / _ 2_ объектов.
Проблема в том, что ни одно из этих решений не работает напрямую с настройками локали 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?
std::time_get::get
определяется C ++ 0x 22.4.5.1.1 / 6… Я просто случайно открыл страницу, но я предполагаю, что она и на C ++ 03. - person Potatoswatter   schedule 05.10.2010