2017-01-05 3 views
2

週の文字列表現を比較したいと思います。週 "01/17"は "02/17"の前と "52/16"の後にあります。Javaを使用した比較のための週文字列の解析8

次のコードでは例外がスローされます。文字列が毎週の正確な日にヒントしないためです。しかし、私は気にしない - それは、すべての月曜日または木曜日または何が考えられます。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ww/YY", Locale.GERMANY); 
LocalDate date1 = formatter.parse(str1, LocalDate::from); 

私は、パーサーを変更する必要がありますか?または、他の形式に解析しますか? Unfortunatley何週目のようなオブジェクトもありません...

+1

ここで「週」の定義は正確には何ですか? –

答えて

5

一つの解決策は、常にをデフォルトになります同じ日、月曜日と言う。あなたはそのためのカスタムフォーマッタを構築することができます:1月17日は16分の52の後であるため、trueを印刷し

LocalDate d1 = LocalDate.parse("01/17", fmt); 
LocalDate d2 = LocalDate.parse("52/16", fmt); 
System.out.println(d1.isAfter(d2)); 

:あなたは今LocalDate特定の週の月曜日を表すSを構築することができ

DateTimeFormatter fmt = new DateTimeFormatterBuilder() 
      .appendPattern("ww/YY") 
      .parseDefaulting(ChronoField.DAY_OF_WEEK, 1) 
      .toFormatter(Locale.GERMANY); 

+0

偉大な、parseDefaulting()は欠けていた部分でした:) – Tom

2

私はDateTimeFormatterクラスで動作する方法を見つけることができませんでしたが、私は別のアプローチを提案したいと思います。

Threeten Extra libraryには、java.timeライブラリに含めるにはあまりにも限定的であると思われるいくつかのクラスが含まれています。そのうちの1つは、あなたが言及したYearWeekクラスです。

あなたの問題は、入力文字列から手動で週数と年を解析し、このようYearWeekクリエーター・メソッドを呼び出すことによって解決することができます。

YearWeek yw = YearWeek.of(year, monthOfYear); 
+1

ありがとう、このライブラリを知っておきたい。私が発見したことは非常に奇妙なことですが、パターン文字列を使ってフォーマッタを構築すると、from()を使ってYearWeekを作成するのに必要な詳細が得られません。しかし、DateTimeFormatterBuilderで構築されたものが動作します。しかし、私はconfigからパターンを供給したいので残念です。 – Tom

+2

@Tom代わりに、さらに多くのエキストラがありますが、クラス[CalendarWeek](http://time4j.net/javadoc-en/net/time4j/range/CalendarWeek.html)を提供する私のlib Time4Jもあります。良いi18n -supportとweek-arithmetic( 'plusWeeks()'のようなメソッドで)両方ともThreeten-Extraには欠けている。しかし、カレンダーの週を比較する場合にのみ、余分な依存関係を追加する必要はないようです。 –

2

TL; DR

YearWeek.parse("2017-W01") 

ISO 8601

またはいくつかの他の形式に解析しますか?

はい、別の形式を使用してください。

日時の値をテキストにシリアル化するときは、標準のISO 8601形式を使用してください。標準にはsupport for week datesが含まれます。

4桁の年 - 1週間、ハイフン、W、およびその週の2桁です。

2017-W01

は「週」のあなたの定義を明確に取得します。

  • 週第1位は、今年の最初の木曜日が含まれており、
  • ラン月曜日 - 日曜日:ISO 8601の定義は、ということです。

したがって、52,53週間のいずれかの年を実行します。そして、この定義の下では、今年の最初の数日は、週番号を付ける前の年になるかもしれないことに注意してください。同様に、今年の最後の数日は、週番号を付けると翌年になる可能性があります。

その週に特定の曜日を表示する場合は、ハイフンと月曜日〜日曜日の1〜7の1桁の数字を追加します。

ヒント:お使いのコンピュータでデフォルトでISO 8601の週番号を表示するには、OSの設定を調整する必要があります。たとえば、macOSの場合、Calendar.appなどのアプリケーションでこの標準の定義で週番号を表示するには、システム環境設定>言語&地域>カレンダー> ISO 8601を設定します。

2017-W01-7

ところで

、同様の表現のカップル:

  • 年から実行されている日の年の数を意味序日1〜366は年、ハイフン、3桁の数字です。2017-123
  • 年を除く月の日は2つのハイフン、月の番号、ハイフン、および月の番号です。--01-07

Questionで見られるLocaleの使用は、標準ISO 8601フォーマットとは無関係です。

YearWeek

週間YEARMONTHのようなオブジェクトがないUnfortunatley ...

ああ、そこなクラスです。

週のアイデアを直接表すクラスについては、correct Answer by Henrikを参照してください。その回答はThreeTen-Extra図書館のクラスYearWeekを示しています。

YearWeekクラスは、標準形式の文字列を直接解析して生成できます。

YearWeek yw = YearWeek.parse("2017-W01"); 

あなたは方法でYearWeekオブジェクトを比較することができますcompareToequalsisBeforeisAfterを。

yw.isBefore(thatYw) 

ThreeTen-エクストラプロジェクトは、あなたが役立つことができるようYearQuarterなどの他のクラスを提供しています。

関連する問題