我有一个静态 ArrayList 在启动时从 Firebase 填充以存储各种值。我需要存储的 FB 字段之一是时间戳。
我需要将时间戳存储在数组中,然后以可读的日期格式显示它。
初始化ArrayList:
static ArrayList<String> suspectedValues = new ArrayList();
从FB获取时间戳:
Timestamp dtg = (Timestamp) document.getData().get("dtg");
将时间戳设置为字符串并存储在数组中:
String timeStamp = String.valueOf(dtg);
String suspectedData [] = {timeStamp};
suspectedValues.addAll(Arrays.asList(suspectedData));
稍后在不同的 Activity onCreate 中:
int counter = 0;
for(int i = 0; i < suspectedValues.size(); i = i + 4){
String timeStamp = suspectedValues.get(4);
Date dtg = new Date(Long.parseLong(timeStamp));
gMap.addMarker(new MarkerOptions().position(latLng).title(suspected).snippet("id: " + id + " | " + taggedAt + ": " + dtg).icon(BitmapDescriptorFactory.fromBitmap(smallMarker)));
if(suspectedValues.size() != 0){
counter = counter + 4;
}
}
我尝试了时间戳、日期和字符串之间的多种不同转换,但无法使其工作。当我尝试设置日期 dtg 时,我得到:
java.lang.NumberFormatException: For input string: "56.504800874303676"
at java.lang.Long.parseLong(Long.java:594)
at java.lang.Long.parseLong(Long.java:636)
我也尝试过:
Timestamp dtg = (Timestamp) document.getData().get("dtg");
Date date = dtg.toDate();
String timeStamp = date.toString();
String suspectedData [] = {timeStamp};
suspectedValues.addAll(Arrays.asList(suspectedData));
与:
String timeStamp = suspectedValues.get(4);
Date theSameDate = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy").parse(timeStamp);
但它不断抛出解析异常。
Timestamp from FB: Timestamp(seconds=1583706187, nanoseconds=895000000)
Converted to Date: Sun Mar 08 22:23:07 GMT 2020
timestamp String going into Array: Sun Mar 08 22:23:07 GMT 2020
timestamp String coming out of Array: 62.76105524614817
I/MapsActivity: ParseException: java.text.ParseException: Unparseable date: "62.76105524614817"
最佳答案
好吧,我想出了一个解决方法,
我创建了两个单独的 ArrayList,一个接受 String,第二个接受 Date。
static ArrayList<String> suspectedValues = new ArrayList();
static ArrayList<Date> suspectedDateValues = new ArrayList<>();
我将所有日期放入第二个 ArrayList 而不是第一个。
我还创建了 2 个计数器。
int counter = 0;
int counter1 = 0;
我知道第一个 ArrayList 中每 3 个值后面就有一个日期。因此,当我迭代第一个列表时,我调用一个新方法,传入第一个方法中的所有值,该方法从第二个 ArrayList 中检索日期,并使用该日期和传递的值来执行我的任务。
for(int i = 0; i < suspectedValues.size(); i = i + 3){
[snip]
getSuspectedDate(lat, lng, gMap, counter1, passedActivity, id, smallMarker);
if(suspectedValues.size() != 0){
counter = counter + 3;
counter1 = counter1 + 1;
}
}
我的 final方法在上面的 for
循环的每次迭代中执行:
public void getSuspectedDate(double lat, double lng, GoogleMap gMap, int counter1, Activity passedActivity, String id, Bitmap smallMarker){
String suspected = passedActivity.getResources().getString(R.string.suspected);
String taggedAt = passedActivity.getResources().getString(R.string.taggedDTG);
Date date = suspectedDateValues.get(counter1);
String dtg = String.valueOf(date);
LatLng latLng = new LatLng(lat, lng);
gMap.addMarker(new MarkerOptions().position(latLng).title(suspected).snippet("id: " + id + " | " + taggedAt + ": " + dtg).icon(BitmapDescriptorFactory.fromBitmap(smallMarker)));
}
不是最干净的解决方案,但它有效!
关于java - 将 Firestore 时间戳存储到 ArrayList<String>,然后存储到日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60625262/