2017-02-27 6 views
3

私には1つの日付があり、土曜日か日曜日かをチェックする必要があります。私は正しい道を進んでいますか?2つの文字列をJavaのDateと比較する

Calendar gcal = new GregorianCalendar(); 
DateFormat dateFormat = new SimpleDateFormat("EEEE"); 
     Date currentDate = gcal.getTime(); 
     String strDate = dateFormat.format(currentDate); 
     if (!"Saturday".equals(strDate)) { 
} 

その正常です。日が土曜日だった場合、私は...日付が土曜日または日曜日だった場合、私は....事前に 感謝をループをスキップする必要があり、同様

+3

JDK 8とjava.timeパッケージを使用する必要があります。 GregorianCalendarはJava 1.0のヴィンテージです。 – duffymo

+0

[String.equals()]の複数の条件(および結果に対するアクション)の可能な複製]](http://stackoverflow.com/questions/10208052/string-equals-with-multiple-conditions-and-one-action- on-result) – Tom

+0

'!'と '||'と他の論理演算子のオペランドは 'boolean'でなければなりません。あなたは 'String'を否定することはできません! –

答えて

7

使用し、Dateオブジェクトをフォーマット/ Calendarメソッドを作成する必要はありません:

Calendar gcal = new GregorianCalendar(); 

if (gcal.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && gcal.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { 

} 
+1

その曜日の+1を確認する正しい方法! –

+0

Gotcha ..ありがとう@Florent Bayle – jai

+0

FYI、[java.util.Calendar'](https://docs.oracle.com/javase/8/docs/api/java/)のような面倒な古い日時クラスutil/Date.html)は現在[legacy](https://en.wikipedia.org/wiki/Legacy_system)であり、[java.time](https://docs.oracle.com/javase/8/) docs/api/java/time/package-summary.html)クラスを使用します。 –

3

if (!"Saturday" || "Sunday".equals(strDate)) {} 

を2つの文字列を比較するカントまたは日曜日私はループをスキップする必要があります。

そして、それはまた

if (!("Saturday".equals(strDate) || "Sunday".equals(strDate)) { 

} 
+2

これは、OPの質問に対処します。曜日をチェックする適切な方法は、GCクラスの定数を使用することです。 – ninnemannk

0

次のようになります。

if (!strDate.matches("Saturday|Sunday")) { 
} 

しかし、それは遅いです。

1

TL; DR

が今日土曜日ですが?

LocalDate.now(ZoneId.of("America/Montreal")) 
     .getDayOfWeek() 
     .equals(DayOfWeek.SATURDAY) 

詳細

は私は正しい道を進んアム??

いいえ。あなたは、java.timeクラスに取って代わった厄介な古い日時クラスを使用しています。

別の問題は、デフォルトのタイムゾーンに暗黙的に依存していることです。意図したタイムゾーンを明示的に指定する方がよいでしょう。タイムゾーンは日付を決定し、日付は曜日を決定するため、タイムゾーンが重要です。

もう1つ問題は、CalendarからDateに不必要に変換されていることです。しかし、これらのクラスを完全に避ける方が良い。

DayOfWeek

DayOfWeekenum 7つのオブジェクト、曜日ごとに1を定義します。

文字列ではなくコードの周りにこれらのオブジェクトを渡す必要があります。下のコードでは、文字列をまったく使用しないことに注意してください。

は、これらのオブジェクトはDayOfWeekない文字列であることは明らかです。それらは実際のオブジェクトであり、いくつかの方法を提供します。これらのメソッドには、英語でハードコードされたStringを生成する、大文字のtoStringが含まれています。方法getDisplayNameは、さまざまな人間の言語で自動的にローカライズされた曜日の名前を生成します。

Javaの列挙型は、従来の他の言語よりもはるかに強力で実用的です。 Oracle Tutorialを参照してください。

LocalDate

LocalDateクラスは、時間日の時間帯なしなし日付専用の値を表しています。

タイムゾーンは、日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。

は、America/MontrealAfrica/Casablanca、又はPacific/Aucklandとして、continent/regionの形式でproper time zone nameを指定します。 ESTまたはISTのような3〜4文字の略語は、ではなく、のように、標準化されておらず、ユニークではない(!)と使用しないでください。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

today.toString():2017年2月27日

DayOfWeekためLocalDateオブジェクトに照会します。

DayOfWeek dow = today.getDayOfWeek(); 

dow.toString():月曜日

は、あなたのターゲットに曜日を比較。

Boolean isTodaySaturday = dow.equals(DayOfWeek.SATURDAY); 

isTodaySaturday.toString():偽

このcode live at IdeOne.comを試してみてください。 java.timeフレームワークは、Java 8に組み込まれており、後にされ

java.timeについてHow to skip weekends while adding days to LocalDate in Java 8?


は、同様の質問を参照してください。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。

ここで、java.timeクラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
      ThreeTenABP
    • プロジェクトは、具体的にはAndroid用(上記)ThreeTen-バックポートを適応させます。
    • How to use ThreeTenABP…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。