তারিখের সীমাগুলির মধ্যে জাভাস্ক্রিপ্ট লুপ


135

দুটি Date()বস্তু দেওয়া হয়েছে , যেখানে একজনের তুলনায় অন্যটি কম, আমি কীভাবে প্রতিদিন তারিখগুলির মধ্যে লুপ করব?

for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{

}

এই ধরণের লুপ কাজ করবে? তবে আমি কীভাবে লুপের কাউন্টারে একদিন যুক্ত করতে পারি?

ধন্যবাদ!

উত্তর:


201

একদিন যোগ করার উপায়টি ব্যবহার করে এটি করার একটি উপায় এখানে প্রয়োজনে পরবর্তী মাসের জন্য তারিখটি রোল করার জন্য এবং মিলিসেকেন্ডের সাথে গোলমাল না করে causes দিবালোক সঞ্চয় কোনও সমস্যা নয়।

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লুপের চূড়ান্ত মান হিসাবে শেষ করবেন ।


অন্য সমস্ত উত্তরের চেয়ে অনেক বেশি পঠনযোগ্য। প্রতিটি লুপ 86400000 মিলিসেকেন্ড যুক্ত করা খুব পঠনযোগ্য নয়।
ওয়েন

1
দিবালোক সাশ্রয়ের সময়গুলি সম্পর্কে সতর্ক থাকুন। d.getDate () + 1 যখন d.getDate () = GMT N এবং d.getDate () + 1 = GMT N - 1 d.getDate () + 1 মাসের একই দিনে দু'বার ফিরে আসে।
রাফায়েল ফন্টেস

1
Date.now()সংজ্ঞা দেওয়ার সময় কেন করবেন now? new Date() ডিফল্টরূপে বর্তমান তারিখটিকে অবজেক্ট হিসাবে ফিরিয়ে দেয় । কনস্ট্রাক্টর Dateছাড়াই কল করা newআপনাকে কেবল একটি তারিখের স্ট্রিং দেয় যা আপনি যাইহোক কোনও তারিখ অবজেক্টে রূপান্তর করেন?
tatlar

আমার জন্য new Date(2012, 0, 1);ভুল দিনটি উত্থাপন করা হয়েছিল (একদিন আগে), ভাল new Date(Date.UTC(2012, 0, 1))কাজ করেছে।
421

আমি ইন্টারনেটে একাধিক সমাধান চেষ্টা করেছি। অদ্ভুত যে এটি কখনও কখনও কিছু দিন এড়িয়ে যায়। ১.১২, ২.১২, ৩.১২, ৫.১২ ... (লক্ষ্য করুন যে 4.12 এড়িয়ে গেছে) কেন এমন হয় তা আমার কোনও ধারণা নেই ... যে কেউ এই সমস্যা পেয়েছে এবং এর সমাধান খুঁজে পেয়েছে?
এরিক কুবিকা

73

টম গ্লেনের উত্তরের উপর ভিত্তি করে।

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);
}

এটি ব্যবহার করতে আপনার কী আমদানি করতে হবে?
DevAllanPer

3
পছন্দ করুন Date একটি বিশ্বব্যাপী অবজেক্ট বিকাশকারী.মোজিলা.আর.ইন.ইউএস
দিমিত্রি পিসারেভ

9

যদি স্টার্টডেট এবং শেষ তারিখটি সত্যই তারিখের অবজেক্ট হয় তবে আপনি এগুলিকে 1 জানুয়ারি 1970, মধ্যরাতের পর থেকে এগুলি সংখ্যায় মিলিসেকেন্ডে রূপান্তর করতে পারেন:

var startTime = startDate.getTime(), endTime = endDate.getTime();

তারপরে আপনি 86400000 (1000 * 60 * 60 * 24) দ্বারা এক থেকে অন্য বাড়ানো লুপটাইমটিতে লুপ করতে পারেন - একদিনে মিলিসেকেন্ডের সংখ্যা:

for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
    var loopDay=new Date(loopTime)
    //use loopDay as you wish
}

1
+1, আমাকে কাজ করার জন্য যথেষ্ট পরিমাণ দিয়েছেন, ive আমার প্রশ্নের কার্যনির্বাহী সমাধান অন্তর্ভুক্ত করেছে
টম গ্লেন

5
দিবালোকের সঞ্চয়ের সময় পরিবর্তনের সময়টি লুপ করার সময় এটি কার্যকর হয় না (যে ক্ষেত্রে এটিই সমস্যা)। অন্যথায় ভাল সমাধান।
চাদ্গ

3
আপনি 86400000একদিনে কয়েক সেকেন্ডও ধরে নিতে পারবেন না are এই লুপটি দিবালোকের সঞ্চয়ী পরিবর্তন এবং অন্যান্য প্রান্তের অবস্থার চেয়ে ভঙ্গুর।
জেরেমি জে স্টারচার

2
ডিএসটি ছাড়াও আরও একটি প্রান্ত শর্ত হ'ল 'লিপ সেকেন্ড'। একটি দ্বিতীয় সেকেন্ডের পার্থক্যটি বিবেচনা করে - তারিখগুলি মিলি সেকেন্ডে রূপান্তরিত একটি নির্দিষ্ট দিনের প্রথম দ্বিতীয়টির সাথে সামঞ্জস্য হয়। এক দ্বিতীয় ত্রুটি এবং আপনি আগের দিন অবতরণ করেছেন।
ওয়াজটেক ক্রুসজেউস্কি

9

আপনি যদি নিজেকে মোমেন্ট.জেএস ব্যবহার করার অনুমতি দেন তবে আমি একটি আরও সহজ উত্তর পেয়েছি বলে মনে করি :

// 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>



2
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
}

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);
}


0

আসুন ধরে নেওয়া যাক আপনি ইউআই থেকে শুরু করার তারিখ এবং শেষের তারিখ পেয়েছেন এবং এটি নিয়ামকের স্কোপ ভেরিয়েবলে সঞ্চয় করে রেখেছেন।

তারপরে এমন একটি অ্যারে ঘোষণা করুন যা প্রতিটি ফাংশন কলে রিসেট হবে যাতে ফাংশনের জন্য পরবর্তী কলে নতুন ডেটা সংরক্ষণ করা যায়।

var dayLabel = [];

নতুন তারিখ (আপনার প্রারম্ভিক চলক) ব্যবহার করা মনে রাখবেন কারণ আপনি যদি নতুন তারিখটি ব্যবহার না করেন এবং সেটটেট ফাংশনটি সরাসরি এটি পরিবর্তনশীলকে অর্পণ করেন তবে প্রতিটি পুনরাবৃত্তির মূল পরিবর্তনশীল মানটি পরিবর্তিত হবে`

for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
                dayLabel.push(new Date(d));
            }

-2

জয়ারজোর উত্তরের ভিত্তিতে:

var loopDate = new Date();
loopDate.setTime(datFrom.valueOf());

while (loopDate.valueOf() < datTo.valueOf() + 86400000) {

    alert(loopDay);

    loopDate.setTime(loopDate.valueOf() + 86400000);
}

এর জন্য একটি মন্তব্য হ'ল তুলনার তুলনায় কমকে অগ্রাধিকার দেওয়া হয়! = যেমন কোনও কারণে একাধিক মাস ধরে লুপ করা যায়! = তুলনা কখনই জ্বলে না।
টম গ্লেন

1
ডিএসটি ছাড়াও আরও একটি প্রান্ত শর্ত হ'ল 'লিপ সেকেন্ড'। একটি দ্বিতীয় সেকেন্ডের পার্থক্যটি বিবেচনা করে - তারিখগুলি মিলি সেকেন্ডে রূপান্তরিত একটি নির্দিষ্ট দিনের প্রথম দ্বিতীয়টির সাথে সামঞ্জস্য হয়। এক দ্বিতীয় ত্রুটি এবং আপনি আগের দিন অবতরণ করেছেন।
ওয়াজটেক ক্রুসজেউস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.