与GregorianCalendar

时间:2016-10-13 18:42:52

标签: java jodatime gregorian-calendar

我正在研究现有的Java应用程序。我的要求是将一个月的值传递给服务。在我的代码之前,他们使用GregorianCalendar来表示日期。目前我修改了部分代码以使用org.joda.time.LocalDate。我知道GregorianCalendar日期索引从零开始,因此今天它显示为 09/13/2016 (表示10月份的09)。 但是我的LocalDate代表是2016年10月13日。如何从我的代码更改为匹配现有代码的值(即2016年9月13日代表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创建的对象具有相同的月份值时。

- EDIT-- 我想将我的List<LocalDate>转换为与GregorianCalendar匹配。我希望我的String []保存与GregorianCalendar日期值匹配的值(即9表示10月份)。请告知我需要将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()]);

1 个答案:

答案 0 :(得分:0)

你假设错误

您误解了[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

     

...格里高利和朱利安日历中的一年中的第一个月是1月,即0;最后一个取决于一年中的月数。

java.time

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

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

转换

你的问题非常令人费解和混乱。

正确转换可以解决您的问题。尝试在java.time类中完成大部分工作,并尽量减少对旧Date&amp;的使用。 Calendar个班级。要进行转换,请查看添加到其他旧类的新方法。有关更多讨论,请参阅我的问题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.Calendar和&amp; java.text.SimpleDateFormat

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

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore