njzkのコメントは、あなたのロジックのマイナーな問題を指摘しています。またjava.time
を使用して
、あなたはjava.timeクラスに取って代わら面倒な古い日付時刻クラス、今の遺産を、使用しています。 java.timeの多くはAndroidとJava 6とJava 7にバックポートされています(下記参照)。
LocalDate
LocalDate
クラスは、時間日の時間帯なしなし日付専用の値を表しています。
タイムゾーン
タイムゾーンは日付を決定する際に重要です。任意の瞬間について、日付は地球の周りでゾーンごとに異なります。たとえば、Paris Franceの真夜中の数分後には、新しい日がありますが、まだ「昨日」はMontréal Québecです。
ZoneId z = ZoneId.of("America/Montreal");
LocalDate today = LocalDate.now(z);
int yearNumber = today.getYear();
int monthNumber = today.getMonthValue();
Year
あなたは、タイプセーフなYear
オブジェクトではなく、単なる整数を使用してカレンダーの状態を維持することができます。 toString
またはgetValue
に電話して、ユーザーに提示してください。
Year year = Year.from(today);
YearMonth
おそらくYearMonth
クラスとカレンダーの状態を維持するために、より多くの意味があります。
YearMonth ym = YearMonth.from(today);
あなたはMonth
列挙型を経由して、月のローカライズされた名前を尋ねることができます
のローカライズ。ローカライズするには、次のように指定します。
TextStyle
文字列の長さまたは短縮を決定します。
Locale
(a)日の名前、月の名前などの翻訳のための人間言語、および(b)略語、大文字小文字、句読点、区切り記号などの問題を決定する文化的な基準を決定する。
Month
オブジェクトを取得し、ローカライズされたString
オブジェクトを生成するように依頼してください。
Month month = today.getMonth(); // Returns an object from enum rather than a mere number.
String output = month.getDisplayName(
TextStyle.NARROW ,
Locale.CANADA_FRENCH
);
数学
クラスは、次または前の月取得、あなたのための数学を行うことができます。 plus…
またはminus…
メソッドに電話することができます。
LocalDate sameDateNextMonth = today.plusMonths(1);
また、TemporalAdjuster
インターフェイスを使用して値を操作することもできます。 TemporalAdjusters
(複数の名前)クラスの実装を探します。 java.timeはimmutable objectsを使用することに注意してください。オブジェクトの状態を変更(変更)するのではなく、元の値に基づく値を持つ新しいオブジェクトが生成されます。
LocalDate firstOfNextMonth = today.with(TemporalAdjusters.firstDayOfNextMonth());
このコードは、質問に表示されている従来のコードよりもはるかに簡単でわかりやすいことに注意してください。
public class CalendarWidget {
Locale locale = Locale.getDefault() ; // Or ask the user, such as Locale.CANADA_FRENCH.
ZoneId zoneId = ZoneId.systemDefault() ; // Or ask the user for desired/expected zone such as `America/Montreal`.
YearMonth displayedYearMonth = YearMonth.from(LocalDate.now(zoneId)); // By default, initialize to ‘today’ in a particular time zone.
…
void moveToNextMonth() {
// Increment the year-month.
this.displayedYearMonth = this.displayedYearMonth.plusMonths(1);
this.updateUserInterface();
}
void moveToPreviousMonth() {
// Decrement the year-month.
this.displayedYearMonth = this.displayedYearMonth.minusMonths(1);
this.updateUserInterface();
}
void updateUserInterface() {
// Update UI.
String textForYearLabel = Integer.toString(this.displayedYearMonth.getYear()) ;
String textForMonthLabel = this.displayedYearMonth.getMonth().getDisplayName(
TextStyle.SHORT ,
this.locale
) ;
…
}
java.timeについて
java.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date
、Calendar
、& SimpleDateFormat
など、面倒な古いlegacy日時クラスに取って代わります。
maintenance modeにあるJoda-Timeプロジェクトは、java.timeクラスへの移行を推奨しています。
Oracle Tutorialを参照して、詳細をご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。
ここで、java.timeクラスを取得するには?
あなたは 'prevMonth = calendar.getTime()を呼び出す;'あなたが今年確認し、変更する前に... – njzk2
njzk2 @あなたは私が年をチェックした後、この行を配置する必要が意味するのですか? – ukama
@ njzk2ありがとうございました! – ukama