2

ミリ秒単位で日付を計算するコードは次のとおりです。

//installment date converted to milliseconds
long localDateInstall = installDate.getTime();

//installment date converted to milliseconds
long localDatePay = payDate.getTime();

ここで、これらの日付間の日数を計算します。

days=Math.abs((localDatePay - localDateInstall))/86400000;

テストしたいときは1/Jan/2012forlocalDateInstall1/Feb/2012forを入力しlocalDatePayます。結果: 29 日. 何が問題ですか?ありがとう

4

3 に答える 3

13

反例:

public static void main(String[] args) throws Exception {
    SimpleDateFormat format = new SimpleDateFormat("d MMM yyyy");
    Date installDate = format.parse("1 Jan 2012");
    Date payDate = format.parse("1 Feb 2012");
    long localDatePay = payDate.getTime();
    long localDateInstall = installDate.getTime();
    long days = Math.abs(localDatePay - localDateInstall) / 86400000;
    System.out.println(days);
}

これは正常に機能し、出力は予想どおり「31」です。問題は、あなたが私たちに伝えていないことのどこかにあります。暗い場所で撮影: おそらく次のようにテスト入力を作成しています:

Date installDate = new Date(2012, 1, 1);
Date payDate = new Date(2012, 2, 1);

残念ながら、それは 2 つの点で間違っています。まず、「年」引数は「年から 1900 年を引いたもの」であると想定されています。次に、1 月は月 1 ではなく月 0です。これら 2 つの日付を入力すると、実際には 29 という答えが得られます。実際には、閏年である 3912 年 2 月の日数を求めているからです。

于 2012-05-13T04:57:18.883 に答える
0

先に進むのに十分な情報はないと思いますが、ここに追求すべきいくつかのアイデアがあります。

  1. 整数演算を実行していますが、これは丸められませんが、1日未満のものは切り捨てられます。1日の終了時刻が開始時刻よりも少し早い場合は、1日が失われます。

  2. タイムゾーンで何かおかしなことが起こっていないことを確認してください。2つの日付は同じ方法で入力されますか、それとも異なるタイムゾーンが関連付けられている可能性のある異なるソースからのものですか?

  3. それぞれの実際のミリ秒値と予想されるタイムゾーンを投稿すると、2つのうちどちらがオフであるかを簡単に判断できるはずです。

于 2012-05-13T05:37:52.233 に答える
0

あなたが試すことができます:

//installment date converted to milliseconds
long localDateInstall=installDate.getTimeInMillis();

//installment date converted to milliseconds
long localDatePay=payDate.getTimeInMillis();

long diff = localDatePay-localDateInstall;

long diffInDays = diff / (24 * 60 * 60 * 1000);    
于 2012-05-13T05:00:25.553 に答える