2016-10-14 5 views
0

カレンダーオブジェクトを使用しているカスタムカレンダーのコードを作成しました。getFirstDayOfWeek()メソッドを使用して毎月の最初の日を取得しました。毎月メソッド " _calendar.getTime() "は最初の日付を返します。すべてのデバイスでそれは正しく返されます。しかし、サムスンJ7では、開始日を2として返します。ここに私のデバッガログがあるサムスンJ7サムスンJ7は2週目の最初の日を返します

java.util.GregorianCalendar [時間= ?, areFieldsSet = falseを、寛大=真、ゾーン=アジア/カルカッタ、firstdayofweekの= 2、minimalDaysInFirstWeek = 4、ERA = 1、 DAY_OF_YEAR = 28、DAY_OF_WEEK = 6、DAY_OF_WEEK_IN_MONTH = 2、AM_PM = 1、HOUR = 3、HOUR_OF_DAY = 15、MINUTE = 46、SECOND = 2016、MONTH = 10、WEEK_OF_YEAR = 41、WEEK_OF_MONTH = 58ミリ秒= 199、ZONE_OFFSET = 19800000、DST_OFFSET = 0]

それはfirstdayofweekの= 2は、デバイスの残りのためにそれはそう1として解決のための任意のアイデアを示して言いましたか?おかげさまで

答えて

0

私は解決策を得ました。 getFirstDayOfWeek()を使用する代わりに、パラメータとして1を渡しました。それで、今は正しく動作しています。

_calendar.set(year, (month - 1), _calendar.getFirstDayOfWeek()); 
0

TLの代わりに

_calendar.set(year, (month - 1), 1); 

; DR

  • あなたが最初の日の週に最初のヶ月を融合するようです。
  • 2は、月曜日を表すハードコードされた定数です。
  • 現在のデフォルトロケールでは、月曜日が週の最初の曜日と見なされているようです。
  • 代わりにjava.timeを使用してください。

    LocalDate.now(ZoneId.of("America/Montreal")) 
         .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) 
    

    月の最初の日の場合:週の最初の日のために

LocalDate.now(ZoneId.of("Pacific/Auckland")) 
     .with(ChronoField.DAY_OF_MONTH , 1L) 

詳細

getFirstDayOfWeek()は、すべての最初の日を取得します月

月の初めに最初の週が混乱しているようです。

月の最初は常に1です。

第1週は、日曜日や月曜日などの曜日です。Calendarクラスの週の最初の曜日の定義は、Localeに応じて異なります。たとえば、北アメリカの多くでは、最初の日は一般的に日曜日です。ヨーロッパの多くでは、週の最初の日が月曜日です。

Localeを指定しない場合、CalendarクラスはJVMの現在のデフォルトロケールを暗黙的に適用します。あなたのデフォルトロケールでは、明らかに週の最初の日が月曜日です。私はあなたが番号2を報告するので、それを推測します。int定数Calendar.MONDAYを検索すると、it is indeed a primitive int of value 2が見つかります。

避けレガシー日時クラス

Calendarクラスは、多くの貧しい設計上の決定を持っています。私は、この曜日の変化する定義をそれらの1つと考えています。 CalendarDateのような厄介な古い日時クラスを避ける理由の多くの1つ。これらのクラスは、現在、java.timeクラスに取って代わられています。 java.time

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); 

の(a)(b)は、特定のDayOfWeek列挙型の日付を取得するにはTemporalAdjustersで定義されたTemporalAdjuster実装を使用し、あなたのための週の最初の日が何であるかを決定し、週の最初の日を取得するにはオブジェクト。

DayOfWeek firstDow = DayOfWeek.MONDAY ; 
LocalDate ld = today.with(TemporalAdjusters.previousOrSame(firstDow)) ; 

月の特定の日のLocalDateを取得するには、withメソッドを呼び出し、ChronoField.DAY_OF_MONTHから列挙型のオブジェクトを渡します。

LocalDate firstOfMonth = today.with(ChronoField.DAY_OF_MONTH , 1L) ; 

java.timeについて

java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.DateCalendar、& SimpleDateFormatなど、面倒な古いlegacy日時クラスに取って代わります。

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

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

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

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