57

私は最近 Java 8 に移行して、できればローカル時間とゾーン時間をより簡単に処理できるようにしました。

ただし、私の意見では、単純な日付を解析するときに単純な問題に直面しています。

public static ZonedDateTime convertirAFecha(String fecha) throws Exception {
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
            ConstantesFechas.FORMATO_DIA).withZone(
            obtenerZonaHorariaServidor());

    ZonedDateTime resultado = ZonedDateTime.parse(fecha, formatter);
    return resultado;
}

私の場合:

  • fecha は「2014 年 6 月 15 日」です。
  • ConstantesFechas.FORMATO_DIA は 'dd/MM/yyyy' です
  • obtenerZonaHorariaServidor は ZoneId.systemDefault() を返します

したがって、これは簡単な例です。ただし、解析では次の例外がスローされます。

java.time.format.DateTimeParseException: テキスト '15/06/2014' を解析できませんでした: TemporalAccessor から ZonedDateTime を取得できません: {}、ISO はタイプ java.time.format.Parsed の 2014-06-15 に解決されました

任意のヒント?解析と TemporalAccesor の使用のさまざまな組み合わせを試してきましたが、これまでのところ運がありません。

4

5 に答える 5

60

入力 (およびフォーマッター) にタイム ゾーン情報がないため、これは機能しません。簡単な方法は、日付をLocalDate最初に (時間またはタイムゾーン情報なしで) 解析してから、次を作成することZonedDateTimeです。

public static ZonedDateTime convertirAFecha(String fecha) {
  DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
  LocalDate date = LocalDate.parse(fecha, formatter);

  ZonedDateTime resultado = date.atStartOfDay(ZoneId.systemDefault());
  return resultado;
}
于 2014-05-11T18:54:31.673 に答える
13

簡単に言えば、ライン

ZonedDateTime.parse('2014-04-23', DateTimeFormatter.ISO_OFFSET_DATE_TIME)

例外をスローします:

Text '2014-04-23' could not be parsed at index 10
java.time.format.DateTimeParseException: Text '2014-04-23' could not be parsed at index 10

私にとってはバグのようです。

私はこの回避策を使用しました:

String dateAsStr = '2014-04-23';
if (dateAsStr.length() == 10) {
    dateAsStr += 'T00:00:00';
}
ZonedDateTime.parse(dateAsStr, DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.systemDefault()));
于 2014-12-04T03:36:00.963 に答える
2

単なる変換の例です。一部の人々は以下の例外を受け取ると思います

(java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: 2014-10-24T18:22:09.800Z of type java.time.Instant)

彼らが試みるなら

LocalDateTime localDateTime = LocalDateTime.from(new Date().toInstant());

問題を解決するには、Zone を渡してください -

LocalDateTime localDateTime = LocalDateTime.from(new Date()
        .toInstant().atZone(ZoneId.of("UTC")));
于 2015-10-27T13:53:12.690 に答える