android 中的日历 class 有什么问题吗?

Is there any issue with Calendar class in android?

我想从 CDT 时区的当前日期起 30 天后每小时打印一次。我已将模拟器和日历实例时区更改为 CDT

但问题是在循环的第 598 次迭代时,日期会自动更改。不确定为什么会这样

我也试过用 final Calendar calendar = new GregorianCalendar(); 但问题是一样的

package com.example.testapplication;

import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.Calendar;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    final Calendar currentTime = Calendar.getInstance();
    currentTime.setTimeInMillis(System.currentTimeMillis());

    final Calendar startTime = Calendar.getInstance();
    startTime.setTime(currentTime.getTime());
    startTime.set(Calendar.MINUTE, 0);
    startTime.set(Calendar.SECOND, 0);
    startTime.add(Calendar.DATE, -30);
    printDatesByHours(startTime.getTime());
}

public static Date addTimeToDate(final Date dateTime, int seconds) {
    final Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(dateTime.getTime() + (seconds * 1000));
    return calendar.getTime();
}

private void printDatesByHours(Date startDate) {
    int i = 30 * 24; //days * hours per day
    int startTime = 0;
    while (i >= 0) {
        Date eventStartDate = addTimeToDate(startDate, startTime);
        Log.d("Date ", eventStartDate.toString());
        startTime = startTime + 3600;
        i--;
    }
}
}

通过 运行 这段代码,您可以看到日期在第 598 次迭代时突然发生变化,如下面打印的日志所示。

Date: Sun Aug 04 07:00:00 CDT 2019
Date: Sun Aug 04 08:00:00 CDT 2019
Date: Sat Jun 15 15:57:13 CDT 2019
Date: Sat Jun 15 16:57:13 CDT 2019

上面日志中的第三个和第四个条目应该如下所示

Date: Sun Aug 04 07:00:00 CDT 2019
Date: Sun Aug 04 08:00:00 CDT 2019
Date: Sun Aug 04 09:00:00 CDT 2019
Date: Sun Aug 04 10:00:00 CDT 2019

在 运行 代码之后,您将获得当前时间的数据,但第 598 个条目将是错误的。请帮忙

您的整数溢出了。

MAX_INT = 2^31 - 1 = 2,147,483,647 您的问题是:598 * 3600 * 1000 = 2,152,800,000 这会导致您的 Integer 变为负数并减去时间。如果您将开始时间更改为 long,这应该可以解决您的问题。