Месячная проблема в классе SimpleDateFormat

86
7

String expiryDate = "2016-03-14";
private String formatDateTime(String expiryDate, String expiryTime) {
SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");
SimpleDateFormat output = new SimpleDateFormat("MMM, dd, yyyy");
try {
String formattedDate = output.format(input.parse(expiryDate ));// parse input
return formattedDate + ", " + expiryTime;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}

Однако, когда он возвращается, он дает 14 января 2016 года.


Желаемый результат был Mar, 14,2016

спросил(а) 2021-01-19T17:45:24+03:00 2 месяца, 3 недели назад
1
Решение
114

mm должен быть капиталом mm. Beacuse


мм представляют минуту ММ представляют месяц

Итак, ваш формат должен выглядеть как


SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

ответил(а) 2021-01-19T17:45:24+03:00 2 месяца, 3 недели назад
86

mm представляет минуты, поэтому, когда вы используете mm, он будет печатать минуты вместо месяца.


Пока ММ представляет месяцы. Вам нужно добавить следующее:

SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

ответил(а) 2021-01-19T17:45:24+03:00 2 месяца, 3 недели назад
75

SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");

должен быть


SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");

мм должен быть ММ

ответил(а) 2021-01-19T17:45:24+03:00 2 месяца, 3 недели назад
61

java.text.SimpleDateFormat внутренне вызывает java.util.Locale, которые имеют фактическую реализацию шаблона даты и формата даты. Итак, In Locale MM определяется в течение месяца и мм в течение нескольких минут. Итак, используя


SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd"); не будет соответствовать шаблону, поэтому по умолчанию месяц будет установлен по умолчанию 1. и он отображается на Jan вместо Mar (что на самом деле ожидает).


Используйте MM для представления месяца. Это решит вашу проблему.


SimpleDateFormat input = new SimpleDateFormat("yyyy-MM-dd");

ответил(а) 2021-01-19T17:45:24+03:00 2 месяца, 3 недели назад
62

SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");

В приведенном выше утверждении необходимо внести поправку:


SimpleDateFormat input = new SimpleDateFormat("yyyy-mm-dd");

Используйте MM вместо mm, поскольку MM используется для месяца, в то время как mm используется для минут.

ответил(а) 2021-01-19T17:45:24+03:00 2 месяца, 3 недели назад
62

На ваш вопрос уже был дан ответ, другие ответы верны. Я хотел бы предоставить современную версию вашего метода.


private static DateTimeFormatter output
= DateTimeFormatter.ofPattern("MMM, dd, yyyy", Locale.ENGLISH);

private static String formatDateTime(String expiryDate, String expiryTime) {
String formattedDate = LocalDate.parse(expiryDate).format(output);
return formattedDate + ", " + expiryTime;
}


Когда я вызываю этот метод с expiryDate из 2016-03-14, я возвращаю Mar, 14, 2016 назад, как ожидалось.


java.time


SimpleDateFormat, который вы используете (и что другие ответы тоже используют), не только давно устарел, но и печально известен. Я рекомендую вам забыть об этом и вместо этого использовать java.time, современный Java-интерфейс даты и времени. С этим гораздо приятнее работать.


Формат ввода 2016-03-14 соответствует ISO 8601, формат, который современные классы анализируют как по умолчанию, то есть без явного форматирования. Таким образом, даже нет возможности получить случай MM в строке шаблона форматирования.


Ссылка: Учебник Oracle: время по дате, объясняющее, как использовать java.time.

ответил(а) 2021-01-19T17:45:24+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема