Dataweave: прошедшие и оставшиеся дни в текущем месяце

Я могу получить количество дней, прошедших в текущем месяце. Но не знаю, как получить количество дней, оставшихся в текущем месяце.

Например, в этом месяце (июнь) прошло дней = 7, а осталось дней = 23.

%dw 2.0
output application/json
---
{
    "daysPassed" : now().day -1,
    "daysLeft" : ""
}

person Nadeem    schedule 08.06.2020    source источник


Ответы (2)


DataWeave, похоже, не имеет встроенной функции для вычисления конца месяца, поэтому я вычисляю его, используя некоторую арифметику даты.

%dw 2.0
output application/json
fun daysLeftOnMonth(d) = do {
    var nextMonthDate = d as Date + |P1M|
    var endOfMonth= ( nextMonthDate  - ( ("P$(nextMonthDate.day as String)D" as Period) )).day
    ---
    endOfMonth - d.day + 1 
}
---
{
    "daysPassed" : now().day - 1,
    "daysLeft" : daysLeftOnMonth(now())
}

Чтобы объяснить более подробно, сначала я добавляю месяц к текущей дате:

var nextMonthDate = d as Date + |P1M|

Затем я перехожу к началу месяца, меньше одного дня, поэтому я получаю последний день текущего месяца:

nextMonthDate  - (("P$(nextMonthDate.day as String)D" as Period)

Уловка заключалась в том, как сохранить динамический период времени в DataWeave. Пришлось его искать. Вы должны построить точку как строку, а затем преобразовать ее в точку.

Затем я просто вычитаю прошедшие дни из числа последнего дня месяца.

person aled    schedule 08.06.2020
comment
Это действительно хорошо работает даже для високосного года. Если вы не против, можете объяснить эти две строчки. Кажется, я не могу осмыслить это. что такое | P1M | ? var nextMonthDate = d as Date + | P1M | var endOfMonth = (nextMonthDate - ((P $ (nextMonthDate.day как строка) D как период))). day - person Nadeem; 08.06.2020
comment
Конечно, я обновил ответ объяснением. - person aled; 08.06.2020

Что-то похожее на это, и вы всегда можете встроить проверку високосного года.

%dw 2.0
output application/json
var thirtyDayMonths = [4,6,8,10]
---
{
    "daysPassed" : now().day -1,
    "daysLeft" : if (thirtyDayMonths contains now().month) 
                         (30-now().day) 
                 else if (now().month == 2) 
                         (28-now().month) 
                 else (31-now().month)
}
person Salim Khan    schedule 08.06.2020
comment
Я не думаю, что исключать високосные годы из уравнения - хорошая идея. - person aled; 08.06.2020
comment
Как я уже сказал, его всегда можно построить ... Я никогда не упоминал о том, чтобы оставить его вне рамок решения. - person Salim Khan; 08.06.2020