【发布时间】:2019-08-11 17:52:42
【问题描述】:
当使用 SimpleDateFormat 从 Firebase Firestore Timestamp 对象生成字符串时,我得到一个不正确/无意义的结果。为什么?
我制作了一些时间戳并将它们发送到 Firestore。我在 Firebase/Firestore 控制台中看到了预期的结果。然后,我从 Firestore 获取文件,从文档中检索时间戳,并首先将它们转换为 Date 对象,然后使用 SimpleDateFormat 转换为字符串。最后一步产生不正确的字符串:特别是时间“18:08:00”而不是“18:28:53”和“19:08:64”而不是“19:28:53”(注意:秒> 59)
Firebase 控制台显示我期望的时间戳:
eventTimestamp August 10, 2019 at 6:28:53 PM UTC+1
collectedTimestamp August 10, 2019 at 7:28:53 PM UTC+1
但以下代码显示了问题(selectedMedEvent 是从检索到的文档中创建的对象,getEventTimestamp() 和 getCollectedTimestamp() 都返回 Firebase Timestamp 对象):
Date eDate = selectedMedEvent.getEventTimestamp().toDate();
Date cDate = selectedMedEvent.getCollectedTimestamp().toDate();
String eString = selectedMedEvent.getEventTimestamp().toString();
String cString = selectedMedEvent.getCollectedTimestamp().toString();
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:MM:SS");
String eventDateString = formatter.format(eDate);
String collectedDateString = formatter.format(cDate);
Log.d(TAG, "Event Date is '" + eDate + "' or " + eString + " but SimpleDateFormat gives '" + eventDateString + "'");
Log.d(TAG, "Collected Date is '" + cDate + "' or " + cString + " but SimpleDateFormat gives '" + collectedDateString + "'");
Logcat 显示按预期打印的两个 Date 对象(与 Firestore 控制台匹配),但在其他地方出现错误:
Event Date is 'Sat Aug 10 18:28:53 GMT+01:00 2019' or Timestamp(seconds=1565458133, nanoseconds=0) but SimpleDateFormat gives '10/08/2019 18:08:00'
Collected Date is 'Sat Aug 10 19:28:53 GMT+01:00 2019' or Timestamp(seconds=1565461733, nanoseconds=648000000) but SimpleDateFormat gives '10/08/2019 19:08:64'
注意非零纳秒。当我创建时间戳时,纳秒值始终为 0。
这是怎么回事,我该如何解决?
稍后:我创建了一个独立的例程来演示该问题。我插入了 Logcat 给我的秒和纳秒值,我得到了相同的意外 SimpleDateFormat 字符串。代码是:
private void showBug() {
Timestamp ts1 = new Timestamp( 1565458133, 0);
Timestamp ts2 = new Timestamp( 1565461733, 648000000);
Date eDate = ts1.toDate();
Date cDate = ts2.toDate();
String eString = ts1.toString();
String cString = ts2.toString();
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:MM:SS");
String eventDateString = formatter.format(eDate);
String collectedDateString = formatter.format(cDate);
Log.d(TAG, "Event Date is '" + eDate + "' or " + eString + " but SimpleDateFormat gives '" + eventDateString + "'");
Log.d(TAG, "Collected Date is '" + cDate + "' or " + cString + " but SimpleDateFormat gives '" + collectedDateString + "'");
}
Logcat 输出与之前报告的相同。
【问题讨论】:
-
仅供参考,诸如
java.util.Date、java.util.Calendar和java.text.SimpleDateFormat等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle。
标签: java firebase google-cloud-firestore timestamp simpledateformat