Я не знаю, что я делаю неправильно? Но я пытаюсь отформатировать мою dateDue строку из SharedPreferences в формат MM/dd/yyyy из MMddyyyy.
Но мой код ниже возвращает все даты с косой чертой, но отображает дату 31.12.1969, а не мой номер SharedPreferences, который должен отображать 30.12.2022. Почему это должно вернуться так далеко? Это как-то связано с календарем?
String myFormat = "MM/dd/yyyy";
SimpleDateFormat format = new SimpleDateFormat(myFormat);
SharedPreferences settings = context.getApplicationContext().getSharedPreferences(name, 0);
Integer dateDue = Integer.valueOf(settings.getInt("dateDue", 0));
format = new SimpleDateFormat(myFormat);
String date = format.format(dateDue);
if (Integer.valueOf(String.valueOf(dueAmount)) > 0) {
holder.getDateDue.setText(String.valueOf(date));
}




Давайте пройдемся по тому, что происходит, это довольно забавно, если вы знаете Java.
format.format(dateDue) реализован DateFormat.format(Object) (поскольку SimpleDateFormat расширяет DateFormat и наследует format(Object) и не переопределяет его). Код для этого:
if (obj instanceof Date)
return format( (Date)obj, toAppendTo, fieldPosition );
else if (obj instanceof Number)
return format( new Date(((Number)obj)...
obj в данном случае это целое число, поэтому оно вызывает format(new Date(obj)...
new Date(<some integer>) создает дату в <some integer> миллисекундах от 1 января 1970 года. https://docs.oracle.com/javase/8/docs/api/java/util/Date.html#Date-long-
А <some integer> здесь 12302022, или 12,3 миллиона миллисекунд, или 12 300 секунд, или 3,4 часа после полуночи 1 января 1970 года, а затем с разницей часовых поясов получается 31 декабря 1969 года.
Начните с использования String.valueOf(dateDue), чтобы вы работали со строкой, а не с целым числом.
Я изменил все это на строки, и это дает мне эту ошибку: java.lang.IllegalArgumentException: невозможно отформатировать данный объект как дату
String dateDue = settings.getString("dateDue", String.valueOf(0)); String dueDate = dateDue; if (Integer.valueOf(String.valueOf(dueAmount)) > 0) { holder.getDateDue.setText(format.format(dueDate)); }LocalDate.parse(
"12302022" ,
DateTimeFormatter.ofPattern( "MMdduuuu" )
)
Ответ Майка Кима кажется правильным и довольно умным в обнаружении проблемы, поскольку ваш вопрос четко не сформулирован. Этот ответ определил, что ваш вклад должен быть "12302022".
Кроме того, вы должны знать, что используете ужасные классы даты и времени, которые много лет назад были вытеснены современными классами java.time, определенными в JSR 310.
Чтобы проанализировать ввод 12302022 в формате ММДДГГГГ, определите соответствующий шаблон форматирования.
DateTimeFormatter f = DateTimeFormatter.ofPattern( "MMdduuuu" ) ;
LocalDateИспользуйте это, чтобы преобразовать строку в объект LocalDate.
LocalDate ld = LocalDate.parse( "12302022" , f ) ;
ld.toString() = 2022-12-30
Этот вывод LocalDate.toString находится в стандартном формате ISO 8601.
Совет. Используйте форматы ISO 8601 для текстового хранения и обмена значениями даты и времени. Форматы разработаны так, чтобы их можно было легко анализировать машиной, а также легко читать людьми.
Классы java.time по умолчанию используют форматы ISO 8601 при разборе/генерации текста.
Android 26+ поставляется с реализацией классов java.time.
В более ранних версиях Android используйте новейшие инструменты для доступа к большинству функций java.time через «дешугаринг API».
Это прекрасно работает, но я хочу использовать косые черты вместо тире, и вы не можете изменить формат даты независимо от того, какой шаблон вы вставили.
Отображает ггггММдд
@user20791491 Определите еще один DateTimeFormatter, передайте LocalDate#format. Найдите Stack Overflow, чтобы узнать больше. Генерация текста из java.time уже обсуждалась много раз.
java.util API даты и времени и их API форматирования, SimpleDateFormat устарели и подвержены ошибкам. Рекомендуется полностью отказаться от их использования и перейти на современный Date-Time API.
Существующие ответы верны, но отсутствуют часть решения, которую вы ищете. Что вам нужно:
MMddyyyy.MM/dd/yyyy.Решение с использованием java.time API:
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
class Main {
public static void main(String[] args) {
DateTimeFormatter parser = DateTimeFormatter.ofPattern("MMdduuuu", Locale.ENGLISH);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM/dd/uuuu", Locale.ENGLISH);
// Given below is a sample date string. In your case it may be,
// String strDateDue settings.getString("dateDue", String.valueOf(0));
String strDateDue = "12302022";
LocalDate date = LocalDate.parse(strDateDue, parser);
String formatted = date.format(formatter);
System.out.println(formatted);
}
}
Выход:
12/30/2022
Здесь вы можете использовать y вместо u, но я предпочитаюuy.
Узнайте больше о современном API Date-Time из Trail: Date Time.
Итак, как мне реализовать это в моем коде, чтобы он работал, потому что я вроде как понимаю, о чем вы говорите?