如何在Mule中获取上月最后一个周一日期?基于Payload的实现方案
没问题,我来帮你搞定在Mule里获取上个月最后一个周一的需求,分两种场景详细说明:
一、通用场景:直接获取当前时间对应的上个月最后一个周一
核心思路是:先定位到上个月的最后一天,再根据这一天的星期数往前调整,找到最近的周一。如果上个月最后一天本身就是周一,那就直接用它。
用DataWeave实现的代码示例如下:
%dw 2.0 output application/json // 定义函数:获取上个月的最后一个周一 fun getLastMondayOfLastMonth() = do { // 步骤1:获取当月第一天,再减1天得到上个月最后一天 var lastDayOfLastMonth = now() >> "startOfMonth" >> adjustDate(-1, "day") // 步骤2:获取该日期的星期数(DataWeave中周一=1,周日=7) var dayOfWeek = lastDayOfLastMonth.dayOfWeek as Number // 步骤3:计算需要往前推的天数:如果是周一推0天,否则推(星期数-1)天 var daysToSubtract = if (dayOfWeek == 1) 0 else dayOfWeek - 1 --- // 调整日期得到最后一个周一 lastDayOfLastMonth adjustDate(-daysToSubtract, "day") } --- { // 输出格式化后的日期字符串,可根据需求修改格式 lastMondayOfLastMonth: getLastMondayOfLastMonth() as String {format: "yyyy-MM-dd"} }
二、基于Payload的场景:根据Payload中的日期计算对应上个月的最后一个周一
如果你的需求是基于Payload里的某个日期(比如用户传入的目标日期),计算该日期所属月份的上个月的最后一个周一,可以用下面的方法:
假设Payload结构是类似 {"targetDate": "2024-05-15"},DataWeave代码如下:
%dw 2.0 output application/json // 定义函数:传入一个日期,返回该日期所属月份的上个月的最后一个周一 fun getLastMondayOfLastMonthFromDate(targetDate: Date) = do { // 步骤1:获取目标日期所在月份的第一天 var startOfTargetMonth = targetDate >> "startOfMonth" // 步骤2:减1天得到上个月最后一天 var lastDayOfLastMonth = startOfTargetMonth adjustDate(-1, "day") // 步骤3:获取星期数并计算需要调整的天数 var dayOfWeek = lastDayOfLastMonth.dayOfWeek as Number var daysToSubtract = if (dayOfWeek == 1) 0 else dayOfWeek - 1 --- lastDayOfLastMonth adjustDate(-daysToSubtract, "day") } --- { // 从Payload中取出日期,转换为Date类型后传入函数,再格式化输出 lastMondayOfLastMonth: getLastMondayOfLastMonthFromDate(payload.targetDate as Date) as String {format: "yyyy-MM-dd"} }
补充说明
- DataWeave的
dayOfWeek函数返回的是枚举值,转成Number后,周一对应1,周日对应7,这个逻辑要注意不要搞混。 - 如果需要不同的日期格式,修改
as String {format: "xxx"}里的格式字符串即可,比如"MM/dd/yyyy"。 - 要是Payload里的日期是DateTime类型,直接传入函数就行,不需要额外转换(函数参数兼容Date和DateTime)。
内容的提问来源于stack exchange,提问作者Saikumar R
相关产品推荐
相关产品推荐

