【问题标题】:month value mismatch when compared with GregorianCalendar与 GregorianCalendar 相比,月份值不匹配
【发布时间】:2016-10-13 18:42:51
【问题描述】:

我正在开发现有的 java 应用程序。我的要求是将一个月的价值传递给服务。之前在我的代码中,他们使用 GregorianCalendar 来表示日期。目前我修改了部分代码以使用 org.joda.time.LocalDate。我知道对于 GregorianCalendar 日期索引从零开始,所以今天它显示为 09/13/2016(表示 09 代表 10 月)。 但以我的 LocalDate 表示,它是 2016 年 10 月 13 日。如何从我的代码更改以匹配现有代码的值(即,09/13/2016 以表示 2016 年 10 月 13 日)。

下面是我的代码。

MyForm.java

private Date myDate;
public java.util.Date getMyDate()
{
    return this.myDate;
}
public void setDate()
{
    int day = getMyDay();
    int month = getMyMonth();
    GregorianCalendar gc = new GregorianCalendar();
    // Advance to next year if the month selected is before current month. This
    // only happens at year end.
    if (gc.get(Calendar.MONTH) > month)
    {
        gc.add(Calendar.YEAR, 1);
    }
   gc.set(Calendar.DATE, day);
    gc.set(Calendar.MONTH, month);
    this.myDate = gc.getTime();
}

MyAction.java

下面的代码代表我的 String[] 保存日期值。

    List<LocalDate> localDatesList = service.getMyDates();
    final List<String> tempDatesList = new ArrayList<>(localDatesList.size());
        for (final LocalDate date : localDatesList) {
            tempDatesList.add(date.toString());
        }
        final String[] formattedDates = tempDatesList.toArray(new String[localDatesList.size()]);
//represents the dates as 2016-10-14 2016-10-15 .

请告知解决此问题的最佳方法。哪一个是修改的最佳选择。我们是否可以处理 LocalDate 和 GregorianCalendar 的这个月份不匹配,以便在比较从 LocalDate 和 GregorianCalendar 创建的对象时具有相同的月份值。

--编辑-- 我想将下面的 List&lt;LocalDate&gt; 转换为与 GregorianCalendar 匹配。我希望我的 String[] 保存与 GregorianCalendar 日期值匹配的值(即 9 代表十月)。请告知我需要将 LocalDate 转换为 GregorianCalendar ...

List<LocalDate> localDatesList = service.getMyDates();
final List<String> tempDatesList = new ArrayList<>(localDatesList.size());
    for (final LocalDate date : localDatesList) {
        tempDatesList.add(date.toString());
    }
    final String[] formattedDates = tempDatesList.toArray(new String[localDatesList.size()]);

【问题讨论】:

  • 我不明白你打算做什么。类似stackoverflow.com/questions/26246030/… ???
  • @GhostCat - 我的应用程序中的一种..现有代码使用 GregorianCalendar API,并且该月值索引从 0 开始,因此对于 10 月,它将 09 表示为月值。但是对于 LocalDate ,10 月的月份值为 10。我想在 LocalDate 和 GregorianCalendar API 中匹配月份值。
  • 任何使用 DateTimeFormatter 正确格式化的 GregorianCalendar 日期将在十月的数字表示中显示 10。如果您使用一些普通格式,则必须添加 1。

标签: java jodatime gregorian-calendar


【解决方案1】:

你猜错了

您误解了 [java.util.GregorianCalendar][1]java.util.Calendar 类。在生成格式化字符串以显示日期时间的值时,它当然会将 1 月至 12 月的月份报告为 1-12,而 10 月份则为 10。所以 10 月 13 日确实会显示为 10/13/2016 不是 09/13/2016,正如你错误地声称的那样。

问题在于获取和设置方法奇怪地使用索引从零开始计数 0-11 的月份。避免麻烦的遗留日期时间类的众多原因之一。引用课堂文档……

java.util.Calendar.MONTH

…公历和儒略历中的第一个月是 JANUARY,即 0;最后一个取决于一年中的月数。

java.time

仅供参考,Joda-Time 项目现在位于maintenance mode,团队建议迁移到java.time 类。

下面的代码使用 java.time 类。概念类似于 Joda-Time,因为 Joda-Time 为 java.time 提供了灵感。

转换

您的问题非常复杂和令人困惑。

正确转换可能会解决您的问题。尝试在 java.time 类中完成大部分工作,并尽量减少使用旧的 DateCalendar 类。要来回转换,请查看添加到等旧类的新方法。更多讨论请参阅我的问题Convert java.util.Date to what “java.time” type?

ZonedDateTime zdt = myGregorianCalendar.toZonedDateTime();
LocalDate ld = zdt.toLocalDate();
Month m = ld.toMonth(); // `Month` enum object, not a number.
int monthNumber = m.getValue();  // Month number 1-12 for Jan-Dec.

或者更简单地说:

int monthNumber = myGregorianCalendar.toZonedDateTime().getMonthValue() ;

无论哪种方式,您都会得到 1-12 月的 1-12 号。

往另一个方向发展。

GregorianCalendar gc = java.util.GregorianCalendar.from( myZonedDateTime );

请注意,我根本没有在 GregorianCalendarZonedDateTime 这两个对象上操作月份字段。

提示:与其传递一个单纯的整数来表示一个月,不如传递Month enum 对象。这使您的代码更具自我记录性,确保有效值范围,并提供type-safety

关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date.Calendarjava.text.SimpleDateFormat

Joda-Time 项目现在位于 maintenance mode,建议迁移到 java.time。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2020-01-24
    相关资源
    最近更新 更多