我想通了。如您所知,当我们在 Android 中处理 Time 时,我们需要注意不同的 API,即 API 26 之前和之后的 API。 Stackoverflow 中有很多关于这个主题的文章,但概括地说,在 Android 8 (Oreo, API 26) 之前我们需要使用库 ThreeTenABP 而在 Android 8 之后我们需要使用 java.time。
实现如下所示:
private Date getCurrentDate(){
if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){
return Date.from(Instant.now());
} else {
AndroidThreeTen.init(this);
return DateTimeUtils.toDate(org.threeten.bp.Instant.now());
}
}
当然,你可以使用LocalDateTime或ZonedDateTime等。
Firebase 需要 Date 对象,或者您可以使用 @ServerTimestamp 注释并且在模型的构造函数中不提供任何参数。然后,Firebase 将在收到保存数据的请求时创建时间戳。像这样
//When you provide Date
class SomeClass {
private String someAttribute;
private Date someDate;
...
public SomeClass(String someAttribute, Date someDate, ...){
this.someAttribute = someAttribute;
this.someDate = someDate;
}
}
//When you don't provide Date
class SomeClass {
private String someAttribute;
private @ServerTimestamp Date someDate;
...
public SomeClass(String someAttribute, ...){
this.someAttribute = someAttribute;
...
}
}
(在开始活动时可能需要 Date 对象,但即使在 2-3 小时后也可能会向服务器发出请求。这就是为什么 @ServerTimestamp 对我来说效率低下。)
检索以相同的方式发生。创建一个模型类,或使用HashMap(您的选择),但类型必须是Date。它根据日期和时间(时区,时间甚至高达微秒等)保存几乎所有类型的信息。
大多数时候,用户只想查看小时:分钟形式的日期和时间。
您可以使用DateTimeFormatter 并提供您想要的模式(有很多标准)。就我而言,我以这种方式使用它:
private String formatDate(Date date){
if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){
java.time.LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
java.time.format.DateTimeFormatter dtf = java.time.format.DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
return ldt.format(dtf);
} else {
LocalDateTime ldt = Instant.ofEpochMilli(date.getTime()).atZone(org.threeten.bp.ZoneId.systemDefault()).toLocalDateTime();
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
return ldt.format(dtf);
}
}
如您所见,该方法需要一个 Date 对象(您从 Firebase 检索的内容)。然后它将删除大部分不相关的数据(在我的情况下)并只返回指定格式的日期和时间。
(注意:在这个post 中,UPDATE 2020/01/17 是,一位同事指出,在 Android Studio 4.0 中,我们也可以在旧 API 中使用 Java 8(就像我的情况一样- API 21),但我没有深入研究具体的主题。你也可以检查一下:)