QLocale toDate всегда возвращает недопустимый QDate в локали "es"
Почему этот код возвращает неверную дату?
QLocale locale("es");
QDate date = locale.toDate("1-Jun-14", "d-MMM-yy");
Если отладить переменную локали, она правильно инициализируется в локали es_ES, но не возвращает дату и date.isValid()
возвращает ложь
2 ответа
Я открыл дело по QT, и ответ таков:
Данные Unicode CLDR для испанского языка имеют точку после названия месяца.
Это не ошибка, ей нужна точка.
Более подробная информация: https://bugreports.qt-project.org/browse/QTBUG-39519
Я не знаю почему, но вы должны поставить .
за месяц (короткая версия). Я попробовал следующий код:
QLocale locale("es");
qDebug() << locale.standaloneMonthName(6, QLocale::ShortFormat);
QDate date = locale.toDate("01-Jun.-14", "dd-MMM-yy");
qDebug() << date;
Выход был на удивление:
"Jun."
QDate("1914-06-01")
Блокирует как ошибка для меня и терпит неудачу, если я пытаюсь использовать его, например, в немецкой локали.
Обновление: Хорошо, я понял. Это довольно запутанно. Вы должны взять короткое имя, данное locale.monthName
, Это, например, для "Jun". для ES и "Juni" для DE. Это не имеет никакого смысла. В Германии короткое название "Juni" - "Jun". Для Испании я не знаю этого. Это ошибка.
Обновление 2: я думаю, что я понимаю систему (по крайней мере, для немецкого языка). Если полное имя превышает 4 символа (например, "Januar"), краткая версия - это настоящая короткая форма ("Jan") с добавленной точкой ("Jan."). Если полное имя короче 4 символов, краткая форма точно такая же, как и длинная форма (например, "Mai"). Но я не понимаю, почему точка добавляется, так как для локали EN она не добавляется.