18

これが、 String を に解析する私の方法LocalDateTimeです。

    public static String formatDate(final String date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS");
        LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
        return formatDateTime.atZone(ZoneId.of("UTC")).toOffsetDateTime().toString();
    }

ただし、これは入力文字列のようにのみ機能します が、 with2017-11-21 18:11:14.05 では失敗します。2017-11-21 18:11:14.057DateTimeParseException

.SSと の両方で機能するフォーマッタを定義するにはどうすればよい.SSSですか?

4

6 に答える 6

26

指定された分数でフォーマッタを構築する必要があります

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .appendPattern("yyyy-MM-dd HH:mm:ss")
  .appendFraction(ChronoField.MILLI_OF_SECOND, 2, 3, true) // min 2 max 3
  .toFormatter();

LocalDateTime formatDateTime = LocalDateTime.parse(date, formatter);
于 2018-01-17T00:20:26.707 に答える
21

Basil BourqueSleiman Jneidiによる回答は優れています。EMH333による回答にも意味があることを指摘したかっただけです。質問のコードを次のように非常に簡単に変更するだけで問題が解決します。

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.[SSS][SS]");

フォーマット パターン文字列の角かっこはオプションの部分を囲んでいるため、これは 3 桁または 2 桁の小数を秒単位で受け入れます。

  • Basil Bourque's answer に対する潜在的な利点: より良い入力検証を提供し、秒に 1 つしかない場合、または 4 つの小数点以下がある場合に反対します (これが利点であるかどうかは、完全に状況によって異なります)。
  • Sleiman Jneidi の回答に対する利点: ビルダーは必要ありません。

考えられる欠点: 小数をまったく受け入れません (小数点がある限り)。

私が言ったように、他のソリューションも非常に優れています。どちらを好むかは、ほとんどが好みの問題です。

于 2018-01-17T12:06:47.037 に答える