我正在使用日期选择器和时间选择器对话框来选择要保存到 Firestore 文档中的日期和时间。我还使用 java 的
LocalDateTime
在本地存储我从选择器对话框中选择的日期和时间。将我为 LocalDateTime
创建的 Map<String, Object>
变量并将其保存到 Firestore 中,将日期和时间保存为 Map
字段,而不是时间戳字段。我在这个网站上看到了类似的问题,但解决方案是使用 LocalDateTime
的前身 Date
。我不打算用旧版本替换 LocalDateTime
只是为了实现我想要做的事情。如果你们知道如何使用 LocalDateTime
将日期和时间存储到 Firestore。
本地日期时间初始化:
LocalDateTime localDateTime = LocalDateTime.now();
int yr = localDateTime.getYear();
int mos = localDateTime.getMonthValue();
int dy = localDateTime.getDayOfMonth();
int hr = localDateTime.getHour();
int min = localDateTime.getMinute();
日期和时间选择器对话框:
DatePickerDialog datePickerDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker datePicker, int year, int month, int day) {
TimePickerDialog timePickerDialog = new TimePickerDialog(DateTimeChoose.this, new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker timePicker, int hour, int minute) {
localDateTime = LocalDateTime.of(year, month+1, day, hour, minute);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("'Elections Will End On:\n'MMM dd, yyyy'\n@ 'hh:mm a");
electionsText.setText(dateTimeFormatter.format(localDateTime));
}
}, hr, min, false);
timePickerDialog.show();
}
}, yr, mos-1, dy);
datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
datePickerDialog.show();
将日期和时间存储到 Firestore:
CollectionReference admin = FirebaseFirestore.getInstance().collection("Admin");
Map<String, Object> electionEndTime = new HashMap<>();
electionEndTime.put("electionEndTime", localDateTime);
admin.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
String adminEmail = "";
List<DocumentSnapshot> documentSnapshots = queryDocumentSnapshots.getDocuments();
for (DocumentSnapshot documentSnapshot : documentSnapshots) {
adminEmail = documentSnapshot.getId();
}
admin.document(adminEmail).set(electionEndTime, SetOptions.merge());
}
});
您不能使用 LocalDateTime 对象,因为它不是支持的数据类型。您可以使用 Date 对象来代替。您可以像在代码中那样简单地编写这样的值。
将 LocalDateTime (java.time) 转换为 Firestore 时间戳
// convert LocalDateTime to Timestamp
fun LocalDateTime.toTimestamp(zone: ZoneId = ZoneId.systemDefault()) = Timestamp(zone).toEpochSecond(), nano)
// convert LocalDateTime to Date
fun Timestamp.toLocalDateTime(zone: ZoneId = ZoneId.systemDefault()) = LocalDateTime.ofInstant(Instant.ofEpochMilli(seconds * 1000 + nanoseconds / 1000000), zone)