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
,这应该可以解决您的问题。
我想从 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
,这应该可以解决您的问题。