Массив инстант из струн - PullRequest
2 голосов
/ 31 октября 2019

У меня есть ArrayList, который я хочу иметь тип Instant, но независимо от того, что я пытаюсь сделать с массивом, он просто не позволяет мне преобразовать его в формат Instant. Ошибка в том, что он пытается добавить String в ArrayList of Instants.

@Data
@RequiredArgsConstructor
@AllArgsConstructor
public static class LiveData {
    private final String location;
    private final String metric;
    private Double data = null;
    private Instant timestamp = null;
}

private void onConnectionOpened() {
        try {
            int i = 0;
            final List<Sensor> sensors = clientConnection.querySensors().get();
            final List<String> metric = sensors.stream().map(sensor -> sensor.getLocation()).collect(Collectors.toList());
            final List<String> location = sensors.stream().map(sensor -> sensor.getMetric()).collect(Collectors.toList());
            List<Instant> timestamps = new ArrayList<>();
            List<Instant> times = new ArrayList<>();
            List<Double> datavalues = new ArrayList<>();
            while (i < sensors.size()) {
                final DataPoint data = clientConnection.queryValue(new Sensor(location.get(i), metric.get(i))).get();
                timestamps.add((Util.TIME_FORMAT.format((new Date(data.getTime()).toInstant()))));
                datavalues.add(data.getValue());
                i++;
            }

            i = 0;
            List<LiveData> testcol = new ArrayList<>();
            while (i < sensors.size()) {
                //LiveData temporary = new LiveData(location.get(i), metric.get(i));
                LiveData temporary = new LiveData(location.get(i), metric.get(i), datavalues.get(i), timestamps.get(i));
                testcol.add(temporary);
                i++;
            }
            ObservableList<LiveData> livedata = FXCollections.observableArrayList(testcol);
            Platform.runLater(() ->
                    tvData.setItems(livedata));
            //Thread.sleep(10000);
            //onConnectionOpened();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

Я хочу иметь ArrayList of Instants и использовать его следующим образом:

LiveData temporary = new LiveData(location.get(i), metric.get(i), datavalues.get(i), timestamps.get(i));

Для последующего использования в TableView.

Я форматирую Instant объекты. Я использую этот формат, чтобы получить более качественный вывод фактической отметки времени, потому что теперь он выглядит так: 2019-07-18T05: 35: 00Z. И я хочу, чтобы это было 2019-07-18 07: 35: 00.

1 Ответ

3 голосов
/ 31 октября 2019

Предполагая, что data.getTime() возвращает long, вам просто нужно

    timestamps.add(Instant.ofEpochMilli(data.getTime()));

Не нужно смешивать старый и плохо спроектированный класс Date, который просто излишне усложнит ситуацию. И бесполезно пытаться отформатировать. Instant не может иметь формат.

Это не совсем понятно без полного контекста, но, вероятно, Util.TIME_FORMAT.format() возвращает String, поэтому вы пытались добавить String в свой список, которыйвызвало сообщение об ошибке, на которое вы ссылались:

Ошибка в том, что он пытается добавить строку в ArrayList of Instants.

В своем комментарии вы сказали:

Я использую этот формат, чтобы получить более качественный вывод фактической отметки времени, потому что теперь он выглядит так: 2019-07-18T05:35:00Z. И я хочу, чтобы это было 2019-07-18 07:35:00.

Извините, это неправильно. Во всех программах, кроме самых простых, вы должны хранить свою модель и свой пользовательский интерфейс отдельно. Instant объекты принадлежат вашей модели. Ваш хороший вывод - конечно, вы должны иметь хороший вывод, только он принадлежит вашему пользовательскому интерфейсу. Итак, что вы хотите и должны сделать, это отформатировать Instant перед выводом (а не перед внесением в список). И я повторяю: Instant не может иметь формат.

Смежные вопросы, задающие только устаревшие Date с форматом:

...