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

时间:2019-06-03 16:43:11

标签: java date arraylist format android-arrayadapter

我有一个列表,当我打印/显示其内容时,会以特定格式获取日期。可以说我想以其他格式获取它们,如何选择要以列表形式打印的格式?

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 个答案:

答案 0 :(得分:1)

如果您执行类似System.out.println(TimeHistory)的操作,或者仅在调试时注意日期,则会调用java.util.Date的{​​{1}}方法。 toString()调用System.out.println(TimeHistory)的{​​{1}}方法,对每个项目java.util.AbstractCollection方法执行调用。

如果要更改此行为,则应扩展toString()并覆盖toString()方法

答案 1 :(得分:1)

tl; dr

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

    }
}

答案 2 :(得分:0)

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

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

编辑后: 显然,现在您很想更改ArrayAdapter的行为,因为默认情况下它使用OBJECT.toString()方法显示数据,因此它使用java.util.Date.toString()。您想要更改此行为,这是您想要的:

Displaying custom objects in ArrayAdapter - the easy way?