Scala中小写month含义及上月最后日期计算变量异常咨询
关于Scala中month相关问题的解答
1. Scala中小写"month"代表什么含义?
咱先唠这个:Scala标准库里其实没有内置的、固定叫month的关键字或者系统变量哦,它基本都是开发者自己定义的变量名,用来存和月份相关的数值或者对象。不过如果你是和Java的类库(比如你提到的java.util.Calendar)混着用的话,Calendar里有个大写的MONTH常量,而小写的month就是你自己声明的、用来指代具体月份值的变量啦~
2. 解决获取上月最后一天时的异常问题
我太懂这种变量突然变值的抓狂感了!先给你揪出根源:你用的java.util.Calendar是个可变对象,直接赋值的话是传引用不是传值,也就是说两个变量指向同一个对象,改一个另一个也会跟着变!而且Calendar的月份确实是从0开始算的(一月=0,三月=2,这点你没记错)。
举个例子,你大概率写了类似这种踩坑的代码:
import java.util.{Calendar, GregorianCalendar} val cal = new GregorianCalendar() cal.set(Calendar.MONTH, 2) // 这里设置的是三月(因为0开始) val lastMonth = cal // 注意!这里是把cal的引用赋值给lastMonth,不是取月份值 cal.add(Calendar.MONTH, 1) // 此时cal变成四月(对应数值3),lastMonth作为同一个对象的引用,自然也显示3
正确的打开方式应该是获取Calendar里的月份数值再赋值,而不是直接传对象引用:
import java.util.{Calendar, GregorianCalendar} // 初始化日历对象 val cal = new GregorianCalendar() // 先把日期设为当月第一天,再往前推一个月,这样就能精准定位到上月 cal.set(Calendar.DAY_OF_MONTH, 1) cal.add(Calendar.MONTH, -1) // 这里才是获取上月的月份数值(比如二月就是1) val lastMonth = cal.get(Calendar.MONTH) // 如果要拿上月最后一天,再加这一步:把日期设为当月的最大天数 cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)) val lastDayOfLastMonth = cal.getTime // 这就是你要的上月最后一天的Date对象
另外友情提示:别再用老旧的Calendar啦!Java 8之后出的java.time类库(Scala完全兼容)香多了——它是不可变对象,线程安全,而且月份是从1开始的(符合咱们的直觉),根本不会出现这种引用导致的数值乱变问题。给你写个简洁版:
import java.time.LocalDate import java.time.temporal.TemporalAdjusters // 获取当前日期 val today = LocalDate.now() // 一步到位获取上月最后一天 val lastDayOfLastMonth = today.minusMonths(1).with(TemporalAdjusters.lastDayOfMonth()) // 获取上月的月份(一月=1,三月=3,不用再掰着指头减1了) val lastMonth = lastDayOfLastMonth.getMonthValue()
这个写法逻辑清晰,还不会踩可变对象的坑,用起来舒服多了~
内容的提问来源于stack exchange,提问作者Bella Wang
相关产品推荐
相关产品推荐

