当前位置: 首页 > 知识库问答 >
问题:

得到本月的最后一个星期一

党佐
2023-03-14

我不知道上个月最后一个星期一的正确日期。我认为像在这个问题中那样计算它并不是绝对正确的,并且想要拒绝常数的算术运算。此代码按预期工作:

public class mCalendar {
  private int thisMonth;
  private int prevMonth;
  private int lstDayThisMonth;
  private int lstDayPrevMonth;
  private int weekOffset;
  private int LstMnd;
  public String monthLetter;
  Locale locale = Locale.getDefault();
  private Calendar mCal;

public mCalendar(){
  this.mCal = Calendar.getInstance();
  mCal.set(Calendar.MONTH,0);
  this.thisMonth = mCal.get(Calendar.MONTH);
  this.prevMonth = thisMonth - 1;
  this.lstDayThisMonth = mCal.getActualMaximum(Calendar.DAY_OF_MONTH);
  this.monthLetter = mCal.getDisplayName(Calendar.MONTH, Calendar.LONG, locale);

  mCal.set(Calendar.MONTH,prevMonth);
  this.lstDayPrevMonth = mCal.getActualMaximum(Calendar.DAY_OF_MONTH);
  mCal.set(Calendar.DAY_OF_MONTH,lstDayPrevMonth);
  this.LstMnd = mCal.get(Calendar.DAY_OF_WEEK_IN_MONTH);
  mCal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
  mCal.set(Calendar.DAY_OF_WEEK_IN_MONTH, LstMnd);
  this.weekOffset = mCal.get(Calendar.DAY_OF_MONTH);
}

但是当我设置日历时。月至1,在建造商主体的第二条指示中日历。每月的第天返回2月的第一个星期一。我希望函数在1月26日返回给我,但现在是2月2日。我认为这是因为2月1日是星期天,但例如,对于三月代码是正确的。

请帮帮我,我很困惑)

共有2个答案

包建义
2023-03-14

上个月最后一个星期一的日期

YearMonth.from(                                                // Represent entire month as a whole.
    LocalDate.now( ZoneId.of( "Africa/Tunis" ) )               // Determine today’s date for a particular time zone.
)
.minusMonths( 1 )                                              // Move to prior `YearMonth`.
.atEndOfMonth()                                                // Get the last day of that prior month as a `LocalDate`.
.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) )  // Move to another date for a Monday, or remain if already on a Monday.

现代方法使用java.time类,而不是麻烦的旧Calendar类。

LocalDate类表示一个只包含日期的值,不包含一天中的时间和时区。

时区对于确定日期至关重要。对于任何给定的时刻,日期因地区而异。例如,法国巴黎午夜后几分钟是新的一天,而魁北克蒙特利尔仍然是“昨天”。

如果未指定时区,JVM将隐式应用其当前默认时区。默认值可能随时发生变化,因此结果可能会有所不同。最好将所需/预期时区明确指定为参数。

大陆/地区的格式指定适当的时区名称,例如美国/蒙特利尔非洲/卡萨布兰卡,或太平洋/奥克兰。切勿使用3-4个字母的缩写,例如ESTIST,因为它们不是真正的时区,不标准化,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" ) ;  
LocalDate today = LocalDate.now( z ) ;

如果要使用JVM的当前默认时区,请询问它并将其作为参数传递。如果省略,则隐式应用JVM的当前默认值。最好是显式的。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

或者指定一个日期。你可以用数字来设定月份,1-12月的数字是1-12。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者,更好的方法是使用预定义的Monthenum对象,一年中每个月一个。提示:在整个代码库中使用这些Month对象,而不仅仅是一个整数,以使代码更加自我记录,确保有效值,并提供类型安全性。

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

使用YearMonth类获取整个月份的数据。

YearMonth thisMonth = YearMonth.from( ld ) ;

移动到上个月。

YearMonth priorMonth = thisMonth.minusMonths( 1 ) ;

获取上个月的最后一天。

LocalDate endOfPriorMonth = priorMonth.atEndOfMonth() ;

获取相对于上个月底的前一个星期一,除非月底本身就是星期一。使用TemporalAdjusters类中的TemporalAdjusters实现来执行此操作。

LocalDate lastMondayOfPriorMonth = endOfPriorMonth.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ) ;

java.time框架内置在Java8及更高版本中。这些类取代了麻烦的旧的遗留日期-时间类,例如java.util.DateCalendar

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

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

从哪里获得java.time课程?

  • JavaSE8、JavaSE9及更高版本
  • java的大部分内容。时间功能被重新移植到Java 6
  • 更高版本的Android捆绑包实现了java。时间课
  • 对于早期的Android,ThreeTenABP项目采用了ThreeTen Backport(如上所述)。了解如何使用ThreeTenABP

Three10-Extra项目通过附加类扩展java.time。该项目是未来可能添加到java.time.的试验场。您可以在此处找到一些有用的类,例如IntervalYearWeekYearQuarter等。

阎裕
2023-03-14

为什么不使用像Joda这样的库呢:

LocalDate lastDay = new LocalDate().minusMonths(1).dayOfMonth().withMaximumValue();
LocalDate lastMonday = lastDayOfMonth.dayOfWeek().withMinimumValue();
 类似资料:
  • 我有一个LocalDateTime对象,我想得到这个月的最后一个日期。所以如果localDateTime指向今天的10月29日。我想把它改为10月31日 有没有干净简单的方法 我的想法: 一种方法是得到这个月,然后做一个转换声明。但这将是一个漫长而乏味的过程。不确定是否有内置的方法来做同样的事情

  • 我想知道特定月份/年份的第一个星期一的日期。 我所拥有的: 我基本上有两个int变量,一个代表年份,一个代表月份。 我想要的是: 我想知道这个月的第一个星期一,最好是整数或整数值。 例如: 我有2014年和1月,这个月的第一个星期一是6号,所以我想返回6号。 问题: 我原以为我可以用做到这一点,但我在设置日历时遇到了问题,因为只有年份和月份可用。此外,我不知道如何使用返回月份/年份的第一个星期一。

  • 问题内容: 我正在一个项目中,要求将日期计算为给定月份的最后一个星期五。我认为我有一个仅使用标准Java的解决方案,但我想知道是否有人知道更简洁或更有效的方法。以下是我今年测试的内容: 问题答案: 根据marked23的建议:

  • 问题内容: 我正在尝试编写这样的日历功能 是整数(1、2、3 …),$ day是一天(Sun,Mon,…)或数字,以较容易的一个为准。方向有些混乱,因为它进行了不同的计算。 举个例子 它使用默认值,并获得5月的第一个星期日,即2009-05-03。如果我们打电话 ,它将返回5月的第二个最后一个星期日,即2009-05-24。 问题答案: 也许可以使其更快。。。 代码非常有趣。 请注意,前进1表示反

  • 我使用石英调度和Spring Batch,我需要在每个月的最后一个星期四运行一个特定的工作。 有可能创建这样的Quartz cron表达式吗? 谢谢

  • 问题内容: python是否提供一种轻松获取 每月 当前星期(1:4)的方法? 问题答案: 为了使用直接除法,您需要根据当月第一天的位置(星期内)来调整您要查看的日期的星期几。因此,如果您的月份恰好在星期一(一周的第一天)开始,则可以按照上面的建议进行除法。但是,如果该月从星期三开始,则需要加2,然后进行除法。这些都封装在下面的函数中。