Как изменить формат даты списка <Date> - PullRequest
0 голосов
/ 03 июня 2019

У меня есть Список, и когда я печатаю / показываю его содержимое, я получаю Даты в определенном формате.Допустим, я хочу получить их в другом формате, как мне выбрать формат, в котором я хочу, чтобы список печатался?

public List<Date> TimeHistory = new ArrayList<Date>();
ArrayAdapter<Date> adapter = new ArrayAdapter<Date>(getActivity(), R.layout.listview_timehistory, R.id.tvTime,TimeHistory);

Этот код, например, дает мне список какЯ хотел, но я хочу получить его в другом формате.

Кстати, когда я добавляю элементы в список, я использую simpleDateFormat с нужным мне форматом.Но когда элементы отображаются в списке, они, похоже, не используют этот формат.

if(Info.get("TIME")!=null)
                    {
                        SimpleDateFormat  format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
                        try {
                            Date date = format.parse(Info.get("TIME"));
                            message.TimeHistory.add(date);
                        }
                        catch (Exception e){

                        }
                    }

Ответы [ 3 ]

1 голос
/ 03 июня 2019

, если вы делаете что-то вроде System.out.println(TimeHistory) или если вы только просматриваете даты во время отладки, вызывается метод java.util.Date s toString().System.out.println(TimeHistory) вызывает java.util.AbstractCollection с toString() Метод, который выполняет вызов для каждого элемента toString() Метод.

Если вы хотите изменить это поведение, вы должны расширить java.util.Date и перезаписать toString() -метод

1 голос
/ 04 июня 2019

ТЛ; др

format.parse( Info.get("TIME") )    // Get a legacy `java.util.Date` object.
.toInstant()                        // Convert from legacy class to modern class.
.atOffset(                          // Convert from the basic `Instant` class to the more flexible `OffsetDateTime` class.
    ZoneOffset.UTC                  // Specify the offset-from-UTC in which you want to view the date and time-of-day. 
)  
.format(                            // Generate text representing the value of our `OffsetDateTime` object.
    DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss" )  // Specify your custom formatting pattern. Better to cache this object, in real work. 
)                                   // Returns a `String

Date был заменен несколько лет назад на Instant. В методе Instant::toString используется гораздо лучший формат, современный стандартный формат.

Instant.now().toString() 

2019-06-04T20: 11: 18.607231Z

Конвертируйте ваши Date объекты, myDate.toInstant().

Подробнее

Метод Object::toString не должен быть гибким. Его целью является предоставление упрощенного представления объекта при отладке или ведении журнала.

Однако, как вы видели, реализация java.util.Date::toString ужасна.

Сначала ложь, применяя текущий часовой пояс JVM по умолчанию к моменту, сохраненному в объекте Date. Этот момент на самом деле в UTC . Это искажение создает иллюзию часового пояса, которого на самом деле нет в объекте.

Во-вторых, метод Date::toString использует ужасный формат, только английский, трудный для чтения людьми и трудно разбираемый машиной.

Класс Date имеет много других проблем. Вы больше не должны использовать этот класс вообще. С принятием JSR 310 его вытеснил класс java.time.Instant.

Вам следует заменить Date на Instant, где вы можете. Где вы не можете конвертировать. Вызовите новые методы, добавленные к старым классам.

Instant instant = myJavaUtilDate.toInstant() ;

К счастью, метод toString на Instant разработан намного лучше. Это говорит вам правду, момент в UTC . И он использует стандартные форматы ISO 8601 . Этот стандарт был придуман специально для передачи значений даты и времени в виде текста таким образом, чтобы их было легко проанализировать на машине и легко прочитать людям в разных культурах.

String output = instant.toString() ;

2019-06-04T20: 11: 18.607231Z

Таким образом, список Instant объектов будет выглядеть следующим образом.

Instant now = Instant.now();
List < Instant > instants = List.of( now.minus( 1L , ChronoUnit.HOURS ) , now , now.plus( 20L , ChronoUnit.MINUTES ) );
String output = instants.toString();

[2019-06-04T19: 41: 51.210465Z, 2019-06-04T20: 41: 51.210465Z, 2019-06-04T21: 01: 51.210465Z]

Ваш кодовый фрагмент

Что касается вашего фрагмента кода, преобразуйте его в объект java.time.OffsetDateTime и сгенерируйте текст с использованием пользовательского шаблона форматирования.

DateTimeFormatter f = DateTimeFormatter.ofPattern( "dd/MM/yyyy HH:mm:ss" ) ;
 …   
if(Info.get("TIME")!=null)
{
    try {
        Date date = format.parse( Info.get("TIME") ) ;
        Instant instant = date.toInstant() ;
        OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;
        String output = odt.format( f ) ;
        message.TimeHistory.add(date);
    }
    catch (Exception e){

    }
}
0 голосов
/ 03 июня 2019

Лучше всего использовать класс simpleDateFormat, где вы указываете формат, используя строку: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

Но объект Date старый, и вы можете использовать классы даты Java8 для времени

ПОСЛЕ РЕДАКТИРОВАНИЯ: По-видимому, теперь ясно, что вы хотите изменить поведение ArrayAdapter, так как по умолчанию он использует метод OBJECT.toString () для отображения данных, поэтому он использует java.util.Date.toString (). Вы хотите изменить это поведение, вот что вы хотите:

Отображение пользовательских объектов в ArrayAdapter - простой способ?

...