我正在研究现有的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()]);
答案 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。避免麻烦的遗留日期时间类的众多原因之一。引用课程文档...
...格里高利和朱利安日历中的一年中的第一个月是1月,即0;最后一个取决于一年中的月数。
仅供参考,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 );
请注意,我没有在任何对象GregorianCalendar
或ZonedDateTime
上操纵月份字段。
提示:不要传递仅仅表示一个月的整数,而是传递Month
enum个对象。这使您的代码更加自我记录,确保一系列有效值,并提供type-safety。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,.Calendar
和&amp; java.text.SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。