2017-11-01 25 views
-4

私はアンドロイドアプリを作っているので、現在の日付と現在の月の最終日の間の日数を計算する必要があります。 今日が2011年1月11日で、今月の最終日が30/11/2017であるとします。 30日後には30日後に翌月が始まるからです。今日の日付から今月の最終日までの日数を取得する方法は?

+2

問題のデバッグに役立つように、既に試したことをいくつか含めてください。 –

+0

グレゴリオ暦を使用したカレンダーインスタンスは、ここでお手伝いします。 – DroiDev

+0

コードを記述する前に、「曜日間」の意味を定義する必要があります。その句があいまいであるためです。 –

答えて

2
Calendar calendar = Calendar.getInstance(); 
    int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); 
    int currentDay = calendar.get(Calendar.DAY_OF_MONTH); 
    int daysLeft = lastDay - currentDay; 


    System.out.println("Last Day: " + lastDay); 
    System.out.println("Current Day : " + currentDay); 
    System.out.println("There are " + daysLeft + " days left in the month."); 

私はjava.timeAndroidで提供されていますが、それがある場合は、LocalDateChronoUnitを使用することができればかなりわからない出力

Last Day: 30 
Current Day : 1 
There are 29 days left in the month. 
+0

私のために働いた、ありがとう – Ticker

+1

働いています。あなたはあなたが新しい開発者だと言いました。どのように、なぜそれが働くのかを理解することは別のものです。コードを盗み、あなたの人生で動かないでください! – DroiDev

+1

このアンサーでは、古くなった厄介な古い日時クラスをjava.timeクラスに置き換えて使用しています。 Androidの場合は、ThreeTen-BackportプロジェクトとThreeTenABPプロジェクトを参照してください。 –

1

LocalDate today = LocalDate.now(); 
LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth()); 

System.out.println(today); // 2017-11-01 
System.out.println(lastDayOfMonth); // 2017-11-30 
System.out.println(ChronoUnit.DAYS.between(today,lastDayOfMonth)); // 29 
+1

java.timeの機能の多くは、ThreeTen-BackportプロジェクトのJava 6およびJava 7にバックポートされています。さらに、ThreeTenABPプロジェクトでAndroidに対応しました。 –

+0

あなたは 'getDays'メソッドを悪用しています。このメソッドは、 'Period'の* part *、年数と月数を数えた後の日数*だけを返します。この特定のケースでは、あなたのコードは機能しますが、私たちは1カ月未満しかないためです。しかし、それは偶然の幸運であり、良いプログラミングではありません。 'Period'クラスは単にこの問題の間違ったクラスです。 –

+0

@BasilBourque、はい、あなたはまったく正しいです、それは私たちにとって 'ChronoUnit.DAYS'です。 –

2

TL; DR

ChronoUnit.DAYS.between(today , firstOfNextMonth) 

java.time

現在の日付を特定するには、タイムゾーンが必要です。任意の瞬間について、日付は地球の周りでタイムゾーンによって異なります。

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

ZoneId z = ZoneId.of("Africa/Casablanca") ; 
LocalDate today = LocalDate.now(z) ; 

それから、月全体を表すオブジェクトを現在のYearMonthにします。

YearMonth ym = YearMonth.from(today) ; 

これで、来月1日に尋ねます。一般に、時間の処理には、Half-Openのアプローチがベストプラクティスです。最初は)ですが、末尾は)です。したがって、今月は、次の月の初めまで実行されますが、それを含みます。

LocalDate firstOfNextMonth = ym.plusMonths(1).atDay(1) ; 

ChronoUnit列挙型を使用し、合計日数のカウントを取得します。

long days = ChronoUnit.DAYS.between(today , firstOfNextMonth) ; 

コンソールにダンプします。

System.out.println(days + " days between " + today + " and " + firstOfNextMonth) ; 

このcode run live at IdeOne.comを参照してください。 FYI 2017年11月1日と2017年12月1日

30日、あなたは時間のスパンを追跡するためにPeriodを使用することができます。他の目的には便利ですが、ではなく、に相当します。 Javaの概要

Period p = Period.between(today , firstOfNextMonth) ; 

。時間

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