繁体   English   中英

Firestore 时间戳到 ArrayList<String> 然后到日期

[英]Firestore Timestamp to ArrayList<String> and then to Date

我在 Firebase 启动时填充了一个静态 ArrayList 来存储各种值。 我需要存储的 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));

稍后在不同的 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;
    }
}

我已经尝试了 Timestamp、Date 和 String 之间的许多不同转换,但无法使其正常工作。 当我尝试设置 Date 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);

但它不断抛出 Parse 异常。

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,一个接受字符串,第二个接受日期。

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;
        }
    }

我的最终方法在上述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)));

        }

不是最干净的解决方案,但它有效!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM