【问题标题】:Why Calendar.SEPTEMBER is not working? [closed]为什么 Calendar.SEPTEMBER 不起作用? [关闭]
【发布时间】:2018-02-15 05:22:58
【问题描述】:

我想查看包含一整天的月份。

private void createRandomData(InMemoryCursor cursor) {
    List<Object[]> data = new ArrayList<>();
    Calendar today = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault());
    today.set(Calendar.HOUR_OF_DAY,0);
    today.set(Calendar.MINUTE, 0);
    today.set(Calendar.SECOND, 0);
    today.set(Calendar.MILLISECOND, 0);
    mStart = (Calendar) today.clone();
    mStart.add(Calendar.SEPTEMBER, -5);
    while (mStart.compareTo(today) <= 0) {
        data.add(createItem(mStart.getTimeInMillis()));
        mStart.add(Calendar.SEPTEMBER, 1);
    }
    cursor.addAll(data);
}

当我写 Calendar.SEPTEMBER(或其他月份)时,我看到 Calendar.SEPTEMBER 上的红线包含:

必须是以下之一:Calendar.ERA、Calendar.YEAR、Calendar.MONTH、Calendar.WEEK_OF_YEAR、Calendar.WEEK_OF_MONTH、Calendar.DATE、Calendar.DAY_OF_MONTH、Calendar.DAY_OF_YEAR、Calendar.DAY_OF_WEEK、Calendar.DAY_OF_WEEK_IN_MONTH、Calendar。 AM_PM、Calendar.HOUR、Calendar.HOUR_OF_DAY、Calendar.MINUTE、Calendar.SECOND、Calendar.MILLISECOND、Calendar.ZONE_OFFSET、Calendar.DST_OFFSET 少... (Ctrl+F1) 此检查查看已使用各种支持注释(例如 RequiresPermission 或 UiThread)注释的 Android API 调用,并标记任何未按照注释指定的正确使用 API 的调用。此检查标记的错误示例: 将错误类型的资源整数(例如 R.string)传递给需要不同类型(例如 R.dimen)的 API。 忘记在需要它的方法中调用被覆盖的方法(通过 super) 调用需要权限的方法,而无需在清单中声明该权限 将资源颜色引用传递给需要 RGB 整数值的方法。 ...还有很多。有关详细信息,请参阅 developer.android.com/tools/debugging/annotations.html 上的文档

当我不顾红线运行它时,它会显示复杂的日期,例如: see

我使用来自 GitHub 的这个库:https://github.com/jruesga/timeline-chart-view 问题与图书馆有关吗?还是关于 Java 日历?

【问题讨论】:

  • 您已被回答:Must be one of: Calendar.ERA, Calendar.YEAR, Calendar.MONTH, Calendar.WEEK_OF_YEAR, Calendar.WEEK_OF_MONTH, Calendar.DATE, Calendar.DAY_OF_MONTH, Calendar.DAY_OF_YEAR, Calendar.DAY_OF_WEEK, Calendar.DAY_OF_WEEK_IN_MONTH, Calendar.AM_PM, Calendar.HOUR, Calendar.HOUR_OF_DAY, Calendar.MINUTE, Calendar.SECOND, Calendar.MILLISECOND, Calendar.ZONE_OFFSET, Calendar.DST_OFFSET
  • 问图书馆作者。
  • mStart.add(Calendar.SEPTEMBER, ...) 真的有意义吗?我的意思是,如果你把九月加到今天,你会得到什么?
  • 如果它是一个选项,那么您也会喜欢Calendar.MONDAY, ... Calendar.SUNDAY 之类的东西。但是,这些枚举在 Calendar 对象中根本没有任何意义。
  • 如果您使用来自 ThreeTenABP 的 LocalDate 而不是早已过时的 Calendar 类,您的工作会更轻松,您的代码也会更自然地阅读。请参阅 Hugo’s answer 及其有用的链接。

标签: java android calendar java.util.calendar


【解决方案1】:

@Michael's answer 中所述,您不能在add 方法中使用Calendar.SEPTEMBER

如果您想增加或减少指定的月数,只需使用Calendar.MONTH。如果你想加/减天,你可以使用Calendar.DAY_OF_MONTH等等。

Calendar API 有时可能会令人困惑(大多数时候,IMO),并且有 lots of problemsdesign issues

在 Android 中,有一个更好的选择:您可以使用 ThreeTen Backport,这是 Java 8 新日期/时间类的一个很好的反向移植。要使其工作,您还需要ThreeTenABP(更多关于如何使用它here)。

当您在默认时区获得 Calendar 时,一个很好的替换候选者是 org.threeten.bp.ZonedDateTime(它代表特定时区中的日期和时间)。首先我使用now() 方法(它采用JVM 默认时区的当前日期/时间)。然后我使用org.threeten.bp.LocalTime 将时间设置为午夜。

我还使用 minusMonths 方法获取当前日期前 5 个月的日期,在循环内我使用 toInstant() 方法获取毫秒值,并使用 plusMonths 方法获取下一个月份:

// get today at default timezone, at midnight
ZonedDateTime today = ZonedDateTime.now().with(LocalTime.MIDNIGHT);
// 5 months ago
ZonedDateTime start = today.minusMonths(5);
while (start.compareTo(today) <= 0) {
    data.add(createItem(start.toInstant().toEpochMilli()));
    start = start.plusMonths(1);
}

如果您想加/减分钟而不是月份,例如,您可以使用方法minusMinutesplusMinutes。其他单位(如小时、天等)还有其他方法,check the javadoc 可以查看所有选项。


使用默认时区的问题是它can be changed without notice, even at runtime,所以最好总是明确说明你使用的是哪个。

使用Calendar,您可以使用TimeZone.getTimeZone(zoneName)

Calendar todayCal = Calendar.getInstance(TimeZone.getTimeZone("Europe/London"), Locale.getDefault());

有了 ThreeTen Backport,你可以使用ZoneId.of(zoneName)

ZonedDateTime today = ZonedDateTime.now(ZoneId.of("Europe/London")).with(LocalTime.MIDNIGHT);

在上面的示例中,我使用了Europe/London,但您可以将其更改为您想要的任何时区。 API 使用IANA timezones names(始终采用Region/City 格式,如America/Sao_PauloEurope/Berlin)。 避免使用 3 个字母的缩写(如 CSTPST),因为它们是 ambiguous and not standard

您可以致电ZoneId.getAvailableZoneIds()TimeZone.getAvailableIDs() 获取可用时区列表(并选择最适合您系统的时区)。

【讨论】:

    【解决方案2】:

    您正在使用不兼容的选项。 Calendar.add() 的第一个参数是时间单位(天、周、小时等),由错误中列出的可能选项定义。 Calendar.SEPTEMBER 不是一个时间单位,它是一个方便的常数,代表 9 月的 MONTH,通常用于 set() 方法。

    假设您正在迭代数月,您将需要 Calendar.MONTH

    【讨论】:

      猜你喜欢
      • 2018-02-15
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-12
      相关资源
      最近更新 更多