我有一个列表,当我打印/显示其内容时,我得到特定格式的日期。假设我想以不同的格式获取它们,我如何选择我想要打印列表的格式?
public List<Date> TimeHistory = new ArrayList<Date>();
ArrayAdapter<Date> adapter = new ArrayAdapter<Date>(getActivity(), R.layout.listview_timehistory, R.id.tvTime,TimeHistory);
例如,此代码为我提供了我想要的列表,但我想以不同的格式获取它。
顺便说一句 当我将项目添加到列表中时,我使用 simpleDateFormat 和我想要的格式。但是当项目显示在 ListView 中时,它们似乎不使用这种格式。
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){
}
}
最佳答案
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
方法并不意味着灵活。其目的是在调试或记录时提供对象的简单 View 。
但是,正如您所看到的,java.util.Date::toString
实现非常糟糕。
首先,将 JVM 当前的默认时区应用于 Date
对象中存储的时刻。那一刻实际上是在 UTC 。这种误报会造成时区实际上不在对象中的错觉。
其次,Date::toString
方法使用了糟糕的格式,只有英文,人类难以阅读,机器也难以解析。
Date
类还有许多其他问题。您根本不应该再使用此类。随着 JSR 310 的采用,它被 java.time.Instant
类取代。
您应该尽可能将 Date
替换为 Instant
。在无法做到的地方,进行转换。调用添加到旧类中的新方法。
Instant instant = myJavaUtilDate.toInstant() ;
幸运的是,Instant
上的 toString
方法设计得更好。它告诉你真相,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){
}
}
关于java - 如何更改List<Date>的日期格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56431448/