0

我想在 JSONata 中以毫秒为单位将给定日期添加几个月或几年,以便它可以执行类似今天加上三个月的操作。我在 JSONata 中没有找到任何函数来完成这项工作,所以我自己实现了一个函数。我以毫秒为单位计算了一个月,并将其乘以我想要添加的月数。下面的代码显示了函数的作用。

(
$addMonths := function($time, $months) {
    2628000000 * $months + $time
};

{
  "datePlus3Month": $addMonths($millis(), 3)
}
)

这似乎有效,但我不知道它有多准确,因为每个月的天数都不一样。那么有没有更好的解决方案来获得更准确的结果呢?

4

1 回答 1

0

我只是有同样的问题。我的解决方案对我来说似乎相当笨拙,但它确实有效。很可能有一个更简单的方法。

$addMonths := function($dateString, $addMonths) {(

    $date := $dateString ~> $toMillis();
    
    $newYear := ($date ~> $fromMillis("[Y,4]") ~> $number());
    $newMonth := ($date ~> $fromMillis("[M]") ~> $number()) + $addMonths;
    $newDay := ($date ~> $fromMillis("[D]") ~> $number());

        $newMonth > 12
    ?   $newYear := $newYear + 1;
    
        $newMonth > 12
    ?   $newMonth := $newMonth - 12;
    
    $lastDay := (
            $newMonth in [1,3,5,7,8,10,12]
        ?   31
        :   $newMonth in [4,6,9,11]
        ?   30
        :   (   $newYear%4=0
                and
                ($newYear%100 != 0 or $newYear%400 = 0)
            ?   29
            :   28)
    );
    
    $newDay > $lastDay 
    ?   $newDay := $lastDay;

    (   $newYear
    &   "-"
    &   $newMonth
    &   "-"
    &   $newDay
    ) ~> $toMillis("[Y]-[M]-[D]")
    ~> $fromMillis()
)};
于 2021-12-02T21:46:55.687 回答