چرا روز 31 باعث ایجاد مشکلات می شود و چگونه آنها را حل کنیم؟

دستکاری تاریخ ها یک کار رایج است، اما می تواند به یک چالش واقعی تبدیل شود، به خصوص در پایان ماه. بیایید بررسی کنیم که چرا اشکالات در 31ام بیشتر است و چگونه از آنها در PHP/Laravel و جاوا اسکریپت اجتناب کنیم.
خرما چگونه کار می کند
اول از همه، ما باید به طور خلاصه بفهمیم که تاریخ ها در برنامه نویسی چگونه کار می کنند. خرما به طور کلی به عنوان تعداد میلی ثانیه از تاریخ 1 ژانویه 1970 در نظر گرفته می شود. دوران یونیکس. این نمایش عددی به شما این امکان را می دهد که تاریخ ها را با عملیات ساده ریاضی دستکاری کنید. با این حال، مشکل زمانی به وجود میآید که سعی میکنیم تاریخها را در ماههایی با تعداد روز متفاوت قرار دهیم.
مشکل دستکاری تاریخ
هر ماه تعداد روزهای متفاوتی دارد که میتواند هنگام تلاش برای جابهجایی از یک ماه به ماه دیگر مشکل ایجاد کند. به عنوان مثال، اگر با تاریخ 31 شروع کنید و سعی کنید به ماه بعد بروید، نتیجه ممکن است غیرمنتظره باشد زیرا همه ماه ها 31 روز ندارند.
مثال در جاوا اسکریپت
تصور کنید در حال ساختن یک تقویم هستید و باید ماه ها را طی کنید.
const toggleMonth = (type) => {
let date = new Date(selectedYear, selectedMonth, selectedDay);
if (type === 'next') {
date.setMonth(date.getMonth() + 1);
}
if (type === 'previous') {
date.setMonth(date.getMonth() - 1);
}
setSelectedYear(date.getFullYear());
setSelectedMonth(date.getMonth());
setSelectedDay(date.getDate());
};
نتیجه کد مشکل
فرض کنید selectedYear
سال 2023 باشد، selectedMonth
باشد 4 (مه) و selectedDay
31 باشد
- وقتی ماه را افزایش می دهیم،
date.setMonth(date.getMonth() + 1)
به ژوئن تغییر می کند، اما از آنجایی که ژوئن فقط 30 روز فرصت دارد، مرورگر به طور خودکار به 1 جولای تنظیم می شود.
راه حل:
const toggleMonth = (type) => {
let date = new Date(selectedYear, selectedMonth, 1); // Comece do primeiro dia do mês
if (type === 'next') {
date.setMonth(date.getMonth() + 1);
} else if (type === 'previous') {
date.setMonth(date.getMonth() - 1);
}
const lastDayOfMonth = new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate();
setSelectedDay(Math.min(selectedDay, lastDayOfMonth)); // Ajuste o dia se necessário
setSelectedYear(date.getFullYear());
setSelectedMonth(date.getMonth());
};
در اینجا، از اول ماه شروع می کنیم و سپس تنظیم می کنیم تا مطمئن شویم به روزی که در ماه وجود ندارد نمی رویم. این مانع از تبدیل شدن 31 می به جای 30 ژوئن، 1 جولای می شود.
مثال در PHP/Laravel
در لاراول تصور کنید می خواهید آخرین روز ماه قبل را دریافت کنید:
کد مشکل:
$lastDayOfPreviousMonth = Carbon::now()->subMonth()->endOfMonth();
نتیجه کد مشکل
تصور کنید که امروز 31 مارس است:
- استفاده كردن
Carbon::now()->subMonth()
، تاریخ به 3 مارس (در سالهای غیر کبیسه) تغییر می کند. - وقتی درخواست می کنیم
->endOfMonth()
، تاریخ به روز آخر اسفند تعدیل می شود که نتیجه آن 31 مارس است که انتظار نمی رود.
راه حل:
$lastDayOfPreviousMonth = Carbon::now()->startOfMonth()->subMonth()->endOfMonth();
در این راه حل مطمئن می شویم که از اولین روز ماه جاری قبل از کم کردن یک ماه شروع می کنیم. این از مشکلات در هنگام برخورد با ماه های با طول های مختلف جلوگیری می کند. به این ترتیب، اگر امروز 31 مارس است، کد به درستی 28 یا 29 فوریه را بر میگرداند.
نتیجه
دستکاری تاریخ ها می تواند دشوار باشد، به خصوص در پایان ماه ها. با شروع از یک تاریخ مطمئن و تنظیم در صورت نیاز، می توانید از بسیاری از اشکالات رایج جلوگیری کنید. این پیشرفت ها را در کد خود اعمال کنید و از سردرد در لحظات مهم جلوگیری کنید!
منابع