如何更改List<Date>的日期格式

How to change the date format of List<Date>

我有一个列表,当我 print/show 它的内容时,我得到了特定格式的日期。比方说我想以不同的格式获取它们,我如何才能选择要打印列表的格式?

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){

                        }
                    }

最好是使用 simpleDateFormat class,您可以在其中使用字符串指定格式: https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

但是 Date 对象是旧的,您可以使用 Java8 日期 classes 作为时间

编辑后: 显然现在很明显你想改变 ArrayAdapter 的行为,默认情况下它使用 OBJECT.toString() 方法来显示数据,所以它使用 java.util.Date.toString()。你想改变这种行为,这就是你想要的:

Displaying custom objects in ArrayAdapter - the easy way?

如果您执行类似 System.out.println(TimeHistory) 的操作,或者如果您 'only' 在调试时查看日期,则会调用 java.util.Dates toString() 方法。 System.out.println(TimeHistory) 调用 java.util.AbstractCollections toString() 方法,对每个项目执行调用 toString() 方法。

如果你想改变这个行为,你应该扩展 java.util.Date 并覆盖 toString()-method

tl;博士

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 class 还有很多其他问题。您根本不应再使用此 class。随着 JSR 310 的采用,它被 java.time.Instant class.

所取代

您应该尽可能将 Date 替换为 Instant。在你不能的地方,转换。调用添加到旧 classes 的新方法。

Instant instant = myJavaUtilDate.toInstant() ;

幸运的是,Instant 上的 toString 方法设计得更好。它告诉你真相,片刻在UTC。它使用标准的 ISO 8601 格式。发明该标准的目的是将 date-time 值作为文本以一种既易于机器解析又易于跨文化的人类阅读的方式进行交流。

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 对象,并使用 custom-defined 格式模式生成文本。

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){

    }
}