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 она не добавляется.

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