You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:34:29