如果我有一天的特定日期,我如何获得前一周中该天的日期?tl;博士java.time关于 java.time

2022-09-04 23:52:27

查看@Basil Bourque的答案以获取最新答案


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

有没有一种简单的方法来做到这一点,例如:

伪代码:

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

答案 1

您应该使用日历:

    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:

构造一个公历日历,其给定日期设置为默认时区和默认区域设置。参数:年份 用于在日历中设置 YEAR 日历字段的值。month 用于在日历中设置 MONTH 日历字段的值。月份值为 0。例如,0 表示 1 月。dayOfMonth 用于在日历中设置DAY_OF_MONTH日历字段的值。


答案 2

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 ); 

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

上周

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

LocalDate weekPrior = localDate.minusWeeks( 1 );

请参阅此代码在 IdeOne.com 实时运行

星期前一天

如果需要一周中的特定日期,请使用时间调整器

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 类?

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