如果我有一天的特定日期,我如何获得前一周的那一天的日期?

从@Basil Bourque那里获得最新答案的答案


例如,如果我有一个“日期”变量“date1”,其值为(dd / mm / yyy)03/07/2011,这是一个星期日。 如何获取上一个星期日“date2”的“日期”? 这将是值(年/月/日)26/06/2011。

有没有一种简单的方法,例如:

伪代码:

Date date1 = (03/07/2011); Date date2 = date1.subtractNumberOfDays(7); 

TL;博士

 LocalDate.of( 2011 , Month.JULY , 3 ) .minusWeeks( 1 ) 

2011-06-26

java.time

问题和答案使用旧的过时的日期时间类。 而是使用java.time类。

LocalDate

LocalDate类表示没有时间且没有时区的仅日期值。

 LocalDate localDate = LocalDate.of( 2011 , Month.JULY , 3 ); 

或者,在第二个参数中传递一个整数而不是Month枚号。 1月至12月通过1-12。

上个礼拜

您可以从该日期减去一周。

 LocalDate weekPrior = localDate.minusWeeks( 1 ); 

请参阅IdeOne.com上的此代码 。

前几天

如果您想要一周中的特定日期,请使用TemporalAdjuster

TemporalAdjusters类中提供了几个这样的方便实现(注意复数的’s’)。

 LocalDate priorTuesday = localDate.with( TemporalAdjusters.previous( DayOfWeek.TUESDAY ) ) ; 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

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

您应该使用日历:

  Calendar date = new GregorianCalendar(2011, Calendar.JULY, 3); date.add(Calendar.DAY_OF_MONTH, -7); System.out.println(date.getTime()); 

您也可以从日期创建日历:

  Date date1 = new Date(111, Calendar.JULY, 3);//the year field adds 1900 on to it. Calendar date = new GregorianCalendar(); date.setTime(date1); date.add(Calendar.DAY_OF_MONTH, -7); date2 = date.getTime(); 

意识到:

  • Java使用0代表1月!
  • 自JDK 1.1版以来,不推荐使用日期(年,月,日)!

请参阅GregorianCalendar JavaDoc:

构造一个GregorianCalendar,并在默认时区中使用默认语言环境设置给定日期。 参数:year用于在日历中设置YEAR日历字段的值。 month用于在日历中设置MONTH日历字段的值。 月值基于0。 例如,0表示1月份。 dayOfMonth用于在日历中设置DAY_OF_MONTH日历字段的值。

更明确的方法:

 Calendar date = new GregorianCalendar(2011, 1, 1); date.add(Calendar.WEEK_OF_MONTH, -1); System.out.println(date.getTime()); 

使用WEEK_OF_MONTHWEEK_OF_YEAR

如果你愿意使用Joda时间,那将非常容易。

一个例子:

 DateTime toDay=new DateTime(); DateTime dateOfPreviousWeek=toDay.minusDays(7); 

另一个:

 DateTime toDay = new DateTime(2011, 7, 1, 0, 0, 0, 0); DateTime dateOfPreviousWeek = toDay.minusDays(7); 

您可以从DateTime获取java.util.Date

 Date javaDate=jodaDateTime.toDate();