【问题标题】:Is there any issue with Calendar class in android?android中的日历类有什么问题吗?
【发布时间】: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 无关。
  • 我建议你不要使用CalendarDate。这些课程设计不良且早已过时。而是使用来自java.time, the modern Java date and time APIZonedDateTime。在早期的 Android 上通过ThreeTenABP
  • @OleV.V.,由于 Android 上的 Java 8 兼容性,ZonedDateTime 类直到 API 26 才被转移。
  • 这是真的,@user2836202,至少部分如此。有一个支持较低 API 级别的反向移植,这就是我要链接的那个:ThreeTenABP(ABP for Android Backport)。

标签: java android date calendar timezone


【解决方案1】:

你的整数溢出了。

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

【讨论】:

  • 哇,这成功了......很好,感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-27
  • 1970-01-01
相关资源
最近更新 更多