【发布时间】:2019-12-17 12:21:19
【问题描述】:
我想从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 个条目将是错误的。请帮忙
【问题讨论】:
-
我在 Java 中复制了这个错误,没有使用任何 android 库,所以它至少看起来与 Android 无关。
-
我建议你不要使用
Calendar和Date。这些课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time API 的ZonedDateTime。在早期的 Android 上通过ThreeTenABP。 -
@OleV.V.,由于 Android 上的 Java 8 兼容性,
ZonedDateTime类直到 API 26 才被转移。 -
这是真的,@user2836202,至少部分如此。有一个支持较低 API 级别的反向移植,这就是我要链接的那个:ThreeTenABP(ABP for Android Backport)。
标签: java android date calendar timezone