[英]How to change the date format of List<Date>
我有一個列表,當我打印/顯示其內容時,會以特定格式獲取日期。 可以說我想以其他格式獲取它們,如何選擇要以哪種格式打印列表?
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){
}
}
如果您執行類似System.out.println(TimeHistory)
或者僅在調試時注意日期,則將調用java.util.Date
的toString()
方法。 System.out.println(TimeHistory)
調用java.util.AbstractCollection
的toString()
方法,該方法將對每個項目的toString()
方法執行一個調用。
如果要更改此行為,則應擴展java.util.Date
並覆蓋toString()
-方法
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() ;
幸運的是, 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){
}
}
最好的方法是使用simpleDateFormat類,在其中使用字符串指定格式: https ://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
但是Date對象很舊,您可以使用Java8日期類作為時間
編輯后:顯然現在您想更改ArrayAdapter的行為,因為默認情況下它使用OBJECT.toString()方法顯示數據,因此它使用java.util.Date.toString()。 您想要更改此行為,這是您想要的:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.