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