2つのDate()オブジェクトがあり、一方が他方よりも小さい場合、日付間で毎日ループする方法を教えてください。
for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{
}
この種のループは機能しますか?しかし、ループカウンターに1日を追加するにはどうすればよいですか?
ありがとう!
必要に応じて、1日追加することで日付を翌月にロールオーバーする方法を使用して、ミリ秒単位で混乱することなく、これを行う方法があります。夏時間も問題ではありません。
var now = new Date();
var daysOfYear = [];
for (var d = new Date(2012, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
daysOfYear.Push(new Date(d));
}
日付を保存する場合は、新しい日付を作成する必要があることに注意してください(上記のnew Date(d)
を使用)。そうしないと、保存されたすべての日付が最終値になります。ループ内のd
。
トム・ガレンの答えに基づきます。
var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var loop = new Date(start);
while(loop <= end){
alert(loop);
var newDate = loop.setDate(loop.getDate() + 1);
loop = new Date(newDate);
}
StartDateとendDateが実際に日付オブジェクトである場合、1970年1月1日午前0時からのミリ秒数に変換できます。次のようになります。
var startTime = startDate.getTime(), endTime = endDate.getTime();
次に、ループタイムを86400000(1000 * 60 * 60 * 24)-1日のミリ秒数だけ増分して、ループを次々にループできます。
for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
var loopDay=new Date(loopTime)
//use loopDay as you wish
}
Moment.js の使用を許可すると、さらに簡単な答えが見つかりました。
// cycle through last five days, today included
// you could also cycle through any dates you want, mostly for
// making this snippet not time aware
const currentMoment = moment().subtract(4, 'days');
const endMoment = moment().add(1, 'days');
while (currentMoment.isBefore(endMoment, 'day')) {
console.log(`Loop at ${currentMoment.format('YYYY-MM-DD')}`);
currentMoment.add(1, 'days');
}
<script src="https://cdn.jsdelivr.net/npm/moment@2/moment.min.js"></script>
ここで私のために働いたシンプルな作業コード
var from = new Date(2012,0,1);
var to = new Date(2012,1,20);
// loop for every day
for (var day = from; day <= to; day.setDate(day.getDate() + 1)) {
// your day is here
}
var start = new Date("2014-05-01"); //yyyy-mm-dd
var end = new Date("2014-05-05"); //yyyy-mm-dd
while(start <= end){
var mm = ((start.getMonth()+1)>=10)?(start.getMonth()+1):'0'+(start.getMonth()+1);
var dd = ((start.getDate())>=10)? (start.getDate()) : '0' + (start.getDate());
var yyyy = start.getFullYear();
var date = dd+"/"+mm+"/"+yyyy; //yyyy-mm-dd
alert(date);
start = new Date(start.setDate(start.getDate() + 1)); //date increase by 1
}
ミリ秒で効率的な方法が必要な場合:
var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
daysOfYear.Push(new Date(d));
}
UIから開始日と終了日を取得し、コントローラーのスコープ変数に保存したと仮定しましょう。
次に、関数呼び出しのたびにリセットされる配列を宣言し、関数の次の呼び出しで新しいデータを保存できるようにします。
var dayLabel = [];
new Date(your starting variable)を忘れずに使用してください
for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
dayLabel.Push(new Date(d));
}
Tabareの回答に基づいて、最後にもう1日追加する必要がありました。
var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var newend = end.setDate(end.getDate()+1);
var end = new Date(newend);
while(start < end){
alert(start);
var newDate = start.setDate(start.getDate() + 1);
start = new Date(newDate);
}