Java 8 - Hashmap не может найти и вернуть значение ZonedDateTime - PullRequest
0 голосов
/ 24 апреля 2019

Я работаю над примером проекта, в котором нам нужно сохранить некоторые значения в Hashmap и извлечь их через службы REST.

размещение данных как

{"timestamp":"2015-09-01T16:40:00.000Z", "temperature":"27.2"}

Метод сохранения:

@PostMapping
public ResponseEntity<?> createCalc(@Valid @RequestBody Calc calc) {
   store.add(measurement);
}
...

Класс магазина

private HashMap<ZonedDateTime, Calc> calcHashMap;
...
public void add(Calc calc) {
  calcHashMap.put(calc.getTimestamp(), calc);
}

После сохранения мы хотели получить данные из Hashmap, никто из нижеприведенных не может их найти.

http://localhost:8000/measurements/2015-09-01T16:40:00.000Z
or 
http://localhost:8000/measurements/2015-09-01T16:40Z

Метод, который мы используем:

  @GetMapping("/{timestamp}")
  public ResponseEntity<Calc> getCalc(@PathVariable ZonedDateTime timestamp) {

  Calc calc = process.fetch(timestamp);

Process.java класс

 public Calc fetch(ZonedDateTime timestamp) {
    return calcMap.get(timestamp);
 }

Добавление этого к Hashmap и Timestamp в качестве ключа. Мы видим эти различия:

  1. При печати значения в консоли с помощью System.out.println 2015-09-01T16: 40Z
  2. Возврат из метода REST GET в POSTMAN показывает это 2015-09-01T16: 40: 00Z
  3. При фактическом значении 2015-09-01T16: 40: 00.000Z

Мне нужно найти временную метку магазина и вернуть объект, но он не найден из-за указанных выше различий. Как это решить?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

В вашем классе Calc вы можете использовать @JsonFormat из библиотеки Джексона и задать нужный вам шаблон.В этом случае "гггг-ММ-дд'ТХЧ: мм: сс.СССХ".Также я предлагаю вам использовать OffsetDateTime напрямую вместо конвертации.

0 голосов
/ 25 апреля 2019

После некоторых исследований я смог решить эту проблему, как показано ниже

for (ZonedDateTime zdt : measurementHashMap.keySet()) {
  if (timestamp.toInstant().compareTo(measurementHashMap.get(zdt).getTimestamp().toInstant()) == 0) {
     return measurementHashMap.get(zdt);
  }
}

Вариант 2: Есть еще один вариант, чтобы преобразовать ZonedDateTime в OffSetDate и затем сравнить. Ссылка: https://rextester.com/SIIIW97667

...