簡體   English   中英

Javascript Moment.js添加到日期(每月兩次)

[英]Javascript Moment.js add to date (twice a month)

我正在使用Moment.js並且我需要創建一個for循環,它將一個特定天數添加到名為theDate的日期變量中,因此'theDate'繼續以半月訂單(每月兩次)推進。

此示例適用於將一天(逐個)添加到dueDate

for (var i = 1; i <= 10; i++) {
    moment(theDate).add(i, 'day').add(1,'day');
    console.log(dueDate);
}

如果'theDate'設置為18.Jan.2017 ,那么上面將打印以下內容:

1/18/17
1/19/17
1/20/17
1/21/17
1/22/17

...

我需要弄清楚如何添加天數(或周數等),以便結果是在半月(每月兩次)訂單中添加天數。 這意味着,如果我的開始日期是18.Jan.2017 2017年, 2017的結果應該是這樣的:

1/18/17
2/01/17
2/18/17
3/04/17
3/18/17
4/01/17
4/18/17
5/02/17
5/18/17
6/01/17
6/18/17
7/02/17
7/18/17
8/01/17
8/18/17
9/01/17
9/18/17
10/02/17
10/18/17
11/01/17
11/18/17
12/02/17
12/18/17

請注意,我不是在尋找第1和第15類型的解決方案,因為我們通常會看到薪水。 我需要每月兩次根據開始日期付款,這可以是用戶決定將其設置為的任何內容。

編輯根據您的回答,我調整了代碼以進行優化,使其更加清晰,並使其開箱即用。

for (var i = 0; i < 24; i++) {
    var finalDate = moment([2017, 0, 31]).add(Math.ceil(0.5 * i), 'month');
    if (i % 2 !== 0) {
        finalDate.subtract(2, 'weeks');
    }
    console.log(finalDate.format("YYYY/MM/DD"));
}

這完全輸出:

2017/01/31
2017/02/14
2017/02/28
2017/03/17
2017/03/31
2017/04/16
2017/04/30
2017/05/17
2017/05/31
2017/06/16
2017/06/30
2017/07/17
2017/07/31
2017/08/17
2017/08/31
2017/09/16
2017/09/30
2017/10/17
2017/10/31
2017/11/16
2017/11/30
2017/12/17
2017/12/31
2018/01/17

請注意, 添加半個月的時間會增加整整一個月 為了使這種行為更加明顯,我明確地進行了整理。

原始答案基於假設

如果您希望半月修復用戶的眼睛,您可以選擇用戶選擇的那一天,並根據它自己設置第二個日期。

如果用戶選擇第23天,則添加15,如果超過28,則包裝(確保)並將第二個日期設置為每月的第10天。

由於每個月都是兩個固定日期,因此您不再需要添加天數。 你只需要添加一個月。 這很簡單:

 var userChosenDate = 23, // if the user chose 28 and higher, just use 28 as a starting point. yourChosenPaymentDate = (Math.min(userChosenDate, 28) + 15) % 28, firstPayment = Math.min(userChosenDate, yourChosenPaymentDate), secondPayment = Math.max(userChosenDate, yourChosenPaymentDate); for (var i = 1; i <= 12; i++) { console.log(i + "/" + firstPayment + "/2017"); console.log(i + "/" + secondPayment + "/2017"); } 

隨着時刻:

var userChosenDate = 23,
    yourChosenPaymentDate = (Math.min(userChosenDate, 28) + 15) % 28,
    firstPayment = moment(Math.min(userChosenDate, yourChosenPaymentDate) + "/1/2017", "D/M/YYYY"),
    secondPayment = moment(firstPayment)
                      .date(Math.max(userChosenDate, yourChosenPaymentDate)),
    format = "MM/DD/YYYY";


console.log(firstPayment.format(format));
console.log(secondPayment.format(format));
for (var i = 1; i < 12; i++) {
    console.log(firstPayment.add(1, 'month').format(format));
    console.log(secondPayment.add(1, 'month').format(format));
}

我很想知道這一點,直到我發現自己找到了最適合我的答案:

for (var i = 1; i <= 24; i++) {
   if (i % 2 === 1) {
     finalDate = moment(theDate).add((1/2)*i, 'month');
   } else {
     finalDate = moment(theDate).add((1/2)*i, 'month').subtract(2,'weeks');
   }
  console.log(finalDate);
}

因此,例如,如果theDate設置為2017年1月18日,它將打印:

January 18th 2017
February 3rd 2017
February 18th 2017
March 3rd 2017
March 18th 2017
April 3rd 2017
April 18th 2017
May 3rd 2017
May 18th 2017
June 3rd 2017
June 18th 2017
July 3rd 2017
July 18th 2017
August 3rd 2017
August 18th 2017
September 3rd 2017
September 18th 2017
October 3rd 2017
October 18th 2017
November 3rd 2017
November 18th 2017
December 3rd 2017
December 18th 2017

試試我的clock.js腳本。

 var twoWeeks = clock.unit.weeks * 2; var twoWeeksFromToday = clock.now + twoWeeks; console.log(clock.what.weekday(twoWeeksFromToday) + ' ' + clock.what.month(twoWeeksFromToday) + ' ' + clock.what.day(twoWeeksFromToday)); 
 <script src="https://rack.pub/clock.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM