2017-01-29 13 views
-2

私のアプリケーションでは、2017年の月とそれらに関連するいくつかのデータを示す2つの矢印があります。ユーザーが ">"をクリックすると、2月などのテキストが表示されます。そして、 "<" 以下のように、現在選択した月の前月を表示します。ボタン次のAndroid:今年と来年の比較

< 1月>

これは私が使用するコードです

Calendar calendar = Calendar.getInstance(); 

calendar.add(Calendar.MONTH, 1); 
Date nextMonth = calendar.getTime(); 
int yearI = calendar.get(Calendar.YEAR); 
if (yearI == 2018) 
    calendar.set(Calendar.YEAR,2017); 

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM"); 
String month = simpleDateFormat.format(nextMonth).toUpperCase(); 

monthName.setText(month); 

Log.d("next month", "" + nextMonth); 

ボタンの次へ:

Calendar calendar = Calendar.getInstance(); 

calendar.add(Calendar.MONTH, -1); 
Date prevMonth = calendar.getTime(); 
int yearI = calendar.get(Calendar.YEAR); 
if (yearI == 2016) 
    calendar.set(Calendar.YEAR,2017); 

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM"); 
String month = simpleDateFormat.format(prevMonth).toUpperCase(); 

monthName.setText(month); 

Log.d("prev month", "" + prevMonth); 

これはうまくいきますが、今月の1月から始まり、次の月をクリックするまで問題が残っています。それは2018年の来年の1月になりますので、2017年1月のデータは初めて表示されません前の月をクリックすると、2017年12月の代わりに2017年1月から2016年に戻ってきます。

2017年の月のみを表示するにはどうすればいいですか?

+1

あなたは 'prevMonth = calendar.getTime()を呼び出す;'あなたが今年確認し、変更する前に... – njzk2

+0

njzk2 @あなたは私が年をチェックした後、この行を配置する必要が意味するのですか? – ukama

+0

@ njzk2ありがとうございました! – ukama

答えて

0

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.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…を参照してください。
関連する問題