Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 得到本月的最后一个星期一_Java_Date_Calendar - Fatal编程技术网

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

Java 得到本月的最后一个星期一,java,date,calendar,Java,Date,Calendar,我不知道上个月最后一个星期一的正确日期。 我认为这样计算是不完全正确的 并且想要拒绝常数的算术运算。 此代码按预期工作: public class mCalendar { private int thisMonth; private int prevMonth; private int lstDayThisMonth; private int lstDayPrevMonth; private int weekOffset; private int LstMnd; pu

我不知道上个月最后一个星期一的正确日期。 我认为这样计算是不完全正确的 并且想要拒绝常数的算术运算。 此代码按预期工作:

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时,
Calendar.DAY\u of u MONTH
返回2月的第一个星期一。我希望函数在1月26日返回给我,但它在2月2日返回。我认为这是因为2月1日是星期天,但是,例如,对于三月代码是正确的


请帮帮我,我很困惑)

为什么不使用如下库:

tl;博士 上月最后一个星期一的日期

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

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

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,中午夜后几分钟是新的一天,而中仍然是“昨天”

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

大陆/地区
的格式指定,例如,或
太平洋/奥克兰
。切勿使用3-4个字母的缩写,如
EST
IST
,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)

如果要使用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.
或者,最好使用预定义的枚举对象,一年中每个月一个。提示:在整个代码库中使用这些
Month
对象,而不仅仅是一个整数,这样可以使代码更加自我记录,确保有效值,并提供更高的可用性

在课堂上获得整个月的成绩

移到上个月

YearMonth priorMonth = thisMonth.minusMonths( 1 ) ;
获取上个月的最后一天

LocalDate endOfPriorMonth = priorMonth.atEndOfMonth() ;
获取相对于上个月底的前一个星期一,除非月底本身是星期一。使用类中的实现执行此操作


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

该项目现已启动,建议迁移到类

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

从哪里获得java.time类

  • ,及以后
    • 内置的
    • 标准JavaAPI的一部分,带有捆绑实现
    • Java9添加了一些次要功能和修复
    • 大部分java.time功能都在中向后移植到Java6和Java7
    • 更高版本的Android捆绑包实现了java.time类
    • 对于早期的Android,该项目采用了ThreeTen Backport(如上所述)。看

该项目使用其他类扩展了java.time。这个项目是java.time将来可能添加的一个试验场。你可以在这里找到一些有用的课程,如、、和。

注意,1表示二月。是的,我知道。但是函数必须返回上个月的最后一个星期一,而不是第一个星期一,不是吗?请注意,问题要求的是“上个月的最后一个星期一”,而不是上个月的最后一天。不过,我会这样开始我的方法。谢谢你的回复,但我不确定为了这个简单的目的使用整个外部库是正确的。为什么代码在除2月份以外的其他月份正常工作?只是无法理解我做错了什么。我不明白为什么在2015年人们仍然不愿意在他们的项目中添加一个小的库,以使他们的生活更轻松:+10kB的最终包不会有任何影响…仅供参考,该项目现在开始了,团队建议迁移到类中。看见
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.
LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;
YearMonth thisMonth = YearMonth.from( ld ) ;
YearMonth priorMonth = thisMonth.minusMonths( 1 ) ;
LocalDate endOfPriorMonth = priorMonth.atEndOfMonth() ;
LocalDate lastMondayOfPriorMonth = endOfPriorMonth.with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ) ;