আমি ওপি-র সংবেদনের সাথে একমত যে এটি পাল্টা স্বজ্ঞাত এবং হতাশার, তবে তাই নির্ধারণ করছে +1 month এটি যেখানে সেই পরিস্থিতিতে বোঝায় । এই উদাহরণগুলি বিবেচনা করুন:
আপনি 2015-01-31 দিয়ে শুরু করেন এবং ইমেল নিউজলেটার পাঠানোর জন্য একটি সময়সূচী পেতে একটি মাস 6 বার যুক্ত করতে চান। ওপি'র প্রাথমিক প্রত্যাশা মাথায় রেখে, এটি ফিরে আসবে:
- 2015-01-31
- 2015-02-28
- 2015-03-31
- 2015-04-30
- 2015-05-31
- 2015-06-30
এখনই, লক্ষ্য করুন যে আমরা প্রত্যাশা +1 monthকরছিlast day of month বা বিকল্প হিসাবে, পুনরাবৃত্তি প্রতি 1 মাস যোগ করতে হবে তবে সর্বদা সূচনা পয়েন্টের প্রসঙ্গে। এটিকে "মাসের শেষ দিন" হিসাবে ব্যাখ্যা করার পরিবর্তে আমরা এটিকে "পরবর্তী মাসের 31 তম দিন বা শেষ মাসের মধ্যে উপলব্ধ" হিসাবে পড়তে পারি। এর অর্থ হ'ল আমরা 30 শে এপ্রিলের পরিবর্তে 30 শে এপ্রিল থেকে 31 মে পর্যন্ত ঝাঁপিয়ে পড়েছি। মনে রাখবেন যে এটি "মাসের শেষ দিন" নয় বলেই নয় তবে আমরা "শুরু মাসের তারিখের নিকটতম উপলব্ধ" চাই।
সুতরাং ধরুন আমাদের ব্যবহারকারীদের মধ্যে একটি 2015-01-30 থেকে শুরু করার জন্য অন্য নিউজলেটারে সদস্যতা নিয়েছে। জন্য স্বজ্ঞাত তারিখ কি +1 month? একটি ব্যাখ্যা হবে "আগামী মাসের 30 তম দিন বা নিকটতম উপলব্ধ" যা ফিরে আসবে:
- 2015-01-30
- 2015-02-28
- 2015-03-30
- 2015-04-30
- 2015-05-30
- 2015-06-30
আমাদের ব্যবহারকারী একই দিনে উভয় নিউজলেটার পেলে ব্যতীত এটি ঠিক থাকবে। আসুন ধরে নেওয়া যাক এটি ডিমান্ড-পার্শ্বের পরিবর্তে সরবরাহের দিকের একটি সমস্যা worried আমরা উদ্বিগ্ন নই যে ব্যবহারকারী একই দিনে ২ টি নিউজলেটার পেয়ে ক্রুদ্ধ হবেন তবে এর পরিবর্তে আমাদের মেল সার্ভারগুলি ব্যান্ডউইথকে দ্বিগুণ প্রেরণের জন্য ব্যয় করতে পারে না অনেক নিউজলেটার। এই বিষয়টি মাথায় রেখে আমরা "+1 মাস" এর "অন্য মাসে দ্বিতীয় মাসের শেষের দিকে প্রেরণ করুন" এর অন্য ব্যাখ্যায় ফিরে যাই যা ফিরে আসবে:
- 2015-01-30
- 2015-02-27
- 2015-03-30
- 2015-04-29
- 2015-05-30
- 2015-06-29
এখন আমরা প্রথম সেটটির সাথে কোনও ওভারল্যাপ এড়াতে পেরেছি, তবে আমরা এপ্রিল এবং ২৯ শে জুনের সাথেও শেষ করেছি, যা অবশ্যই আমাদের মূল অন্তর্দৃষ্টিগুলির সাথে মেলে যা +1 monthকেবল ফিরে আসা উচিত m/$d/Yবা m/30/Yসমস্ত সম্ভাব্য মাসের জন্য আকর্ষণীয় এবং সহজ । সুতরাং এখন +1 monthউভয় তারিখ ব্যবহারের তৃতীয় ব্যাখ্যা বিবেচনা করুন:
31 জানুয়ারী
- 2015-01-31
- 2015-03-03
- 2015-03-31
- 2015-05-01
- 2015-05-31
- 2015-07-01
30 শে জানুয়ারী
- 2015-01-30
- 2015-03-02
- 2015-03-30
- 2015-04-30
- 2015-05-30
- 2015-06-30
উপরের কিছু সমস্যা আছে। ফেব্রুয়ারী এড়িয়ে গেছে, যা সরবরাহ-শেষ উভয়ই সমস্যা হতে পারে (যদি মাসিক ব্যান্ডউইথ বরাদ্দ থাকে এবং ফেব্রুয়ারী অপচয় হয় এবং মার্চ দ্বিগুণ হয়ে যায়) এবং চাহিদা-সমাপ্তি (ব্যবহারকারীরা ফেব্রুয়ারির বাইরে প্রতারণা করে এবং অতিরিক্ত মার্চ বুঝতে পারে) ভুল সংশোধন করার প্রচেষ্টা হিসাবে)। অন্যদিকে, লক্ষ্য করুন যে দুটি তারিখ সেট রয়েছে:
- কখনই ওভারল্যাপ হয় না
- যখন সেই মাসের তারিখ থাকে সর্বদা একই তারিখে থাকে (সুতরাং জানুয়ারী 30 সেটটি বেশ পরিষ্কার দেখাচ্ছে)
- "সঠিক" তারিখ হিসাবে বিবেচিত হতে পারে তার সবকটি 3 দিনের (বেশিরভাগ ক্ষেত্রে 1 দিন) এর মধ্যে রয়েছে।
- তাদের উত্তরসূরি এবং পূর্বসূরীর সমস্ত কমপক্ষে ২৮ দিন (একটি চন্দ্র মাস), তাই খুব সমানভাবে বিতরণ করা হয়।
শেষ দুটি সেট দেওয়া, এটি যদি পরের মাসের বাইরে থেকে পড়ে যায় তবে খেজুরগুলির কোনওটির পিছনে ফিরে যাওয়া কঠিন হবে না (সুতরাং প্রথম সেটে ২৮ শে ফেব্রুয়ারি এবং ৩০ শে এপ্রিল ফিরে যান) এবং কোনও ঘুম না হারালে "মাসের শেষ দিন" বনাম "মাসের দ্বিতীয় দিন থেকে শেষ দিনের" প্যাটার্ন থেকে মাঝে মধ্যে ওভারল্যাপ এবং বিচ্যুতি। তবে গ্রন্থাগারটি "সবচেয়ে সুন্দর / প্রাকৃতিক", "02/31 এর গাণিতিক ব্যাখ্যা এবং অন্যান্য মাসের উপচে পড়া" এবং "মাসের প্রথম বা শেষ মাসের তুলনায়" এর মধ্যে চয়ন করার আশা সর্বদা কারও প্রত্যাশা পূরণ না হওয়ার সাথে শেষ হয় এবং "ভুল" ব্যাখ্যার সূচনা করে এমন বাস্তব-বিশ্ব সমস্যাটি এড়াতে কিছু সময়সূচির "ভুল" তারিখটি সামঞ্জস্য করতে হবে।
সুতরাং আবারও, যখন আমিও প্রত্যাশা করব +1 monthযে তারিখটি প্রকৃতপক্ষে পরবর্তী মাসে হবে, তবে এটি অন্তর্দৃষ্টি হিসাবে সহজ নয় এবং পছন্দগুলি দেওয়া হয়েছে, ওয়েব বিকাশকারীদের প্রত্যাশা নিয়ে গণিতের সাথে যাওয়া সম্ভবত নিরাপদ পছন্দ।
এখানে এমন একটি বিকল্প সমাধান রয়েছে যা এখনও যেকোন মত চতুর কিন্তু আমার মনে হয় এর ভাল ফলাফল রয়েছে:
foreach(range(0,5) as $count) {
$new_date = clone $date;
$new_date->modify("+$count month");
$expected_month = $count + 1;
$actual_month = $new_date->format("m");
if($expected_month != $actual_month) {
$new_date = clone $date;
$new_date->modify("+". ($count - 1) . " month");
$new_date->modify("+4 weeks");
}
echo "* " . nl2br($new_date->format("Y-m-d") . PHP_EOL);
}
এটি সর্বোত্তম নয় তবে অন্তর্নিহিত যুক্তিটি হ'ল: যদি পরের মাসে প্রত্যাশিত ব্যতীত একটি তারিখে 1 মাসের ফলাফল যুক্ত হয় তবে সেই তারিখটি স্ক্র্যাপ করুন এবং এর পরিবর্তে 4 সপ্তাহ যুক্ত করুন। দুটি পরীক্ষার তারিখ সহ ফলাফল এখানে:
31 জানুয়ারী
- 2015-01-31
- 2015-02-28
- 2015-03-31
- 2015-04-28
- 2015-05-31
- 2015-06-28
30 শে জানুয়ারী
- 2015-01-30
- 2015-02-27
- 2015-03-30
- 2015-04-30
- 2015-05-30
- 2015-06-30
(আমার কোডটি একটি জগাখিচুড়ি এবং বহুবর্ষের দৃশ্যে কাজ করবে না the অন্তর্নিহিত ভিত্তিটি অক্ষত রাখার পরে আমি যে কাউকে সমাধানটিকে আরও মার্জিত কোডের সাথে পুনরায় লেখার জন্য স্বাগত জানাই, অর্থাত যদি +1 মাস কোনও ফানকি তারিখ ফিরিয়ে দেয় তবে ব্যবহার করুন পরিবর্তে +4 সপ্তাহ।)