سلام وقت همگی بخیر اساتید محترم اگه بخوام یه سری رکورد خاص رو بخونم چی کار باید بکنم اینجوری که یه فیلد تو جدول داشته باشم که تاریخو ثبت کنه بگم نمایش بده از این تاریخ تا این تاریخ رو
برای چاپ فاکتور میخام که هر ماه برای صصدور فاکتور مثلا کاربر وارد کن از این تاریخ تا این تاریخوو نشون بده
@rostamzadeemran93
واسه تبدیل تاریخ شمسی به میلادی ، میتونی از فانکشن زیر استفاده کنی
public function jalali_to_gregorian($jy, $jm, $jd, $mod = '')
{
if ($jy > 979) {
$gy = 1600;
$jy -= 979;
} else {
$gy = 621;
}
$days = (365 * $jy) + (((int)($jy / 33)) * 8) + ((int)((($jy % 33) + 3) / 4)) + 78 + $jd + (($jm < 7) ? ($jm - 1) * 31 : (($jm - 7) * 30) + 186);
$gy += 400 * ((int)($days / 146097));
$days %= 146097;
if ($days > 36524) {
$gy += 100 * ((int)(--$days / 36524));
$days %= 36524;
if ($days >= 365) $days++;
}
$gy += 4 * ((int)(($days) / 1461));
$days %= 1461;
$gy += (int)(($days - 1) / 365);
if ($days > 365) $days = ($days - 1) % 365;
$gd = $days + 1;
foreach (array(0, 31, ((($gy % 4 == 0) and ($gy % 100 != 0)) or ($gy % 400 == 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) as $gm => $v) {
if ($gd <= $v) break;
$gd -= $v;
}
return ($mod === '') ? array($gy, $gm, $gd) : $gy . $mod . $gm . $mod . $gd;
}
نحوه استفاده هم به این صورت هست که شما باید سال و ماه و روز شمسی به صورت جداگانه به فانکشن پاس بدی ..
$main_date_from = $this->jalali_to_gregorian($year, $month, $day, '-') . ' ' . '00:00:00';
$main_date_to = $this->jalali_to_gregorian($year1, $month1, $day1, '-') . ' ' . '23:59:59';
با سلام و خسته نباشید
شما سه راه مختلف برای اینکار دارید که دوتای اول بهینه هستن و مورد آخری خیر
روش اول :
شما می تونید از یک فیلد timestamp استفاده کنید و تاریخ رو به صورت میلادی توش ثبت کنید و هر وقت خواستید می تونید با عملگرهای کوچکتر یا بزرگنر یا مساوی عملیات مقایسه رو انجام بدید.
روش دوم :
اگه می خوایید تاریخ به صورت شمسی وارد کنید عملیات مشابه روش قبله و اینجا هم یک فیلد timestamp رو تعریف می کنید اما برای ذخیره و بازیابی از یک پکیج بیرونی مثل Verta که کار عملیات تبدیل تاریخ رو به شمسی براتون انجام می ده و مشابه روش قبل می تونید برای مقایسه هم از توابع پکیج استفاده کنید و هم از عملگرهای کوچکتر یا بزرگنر یا مساوی استفاده نمایید.
روش سوم :
که من اصلا توصیه نمی کنم اینکه تاریخ رو به صورت یک رشته (varvhar) ذخیره کنید و خودتون یک تابع برای مقایسه این کار بنویسید
ممنون ولی مقدوره یکم بیشتر توضیح بدین؟ من تو لاراول تازه کارم زیاد تخصصی ندارم ممنون میشم
1 - به نظر بنده کار درستی نیست که تاریخ شمسی به صورت مستقیم در دیتابیس ذخیره بشه
( درستش اینه که تاریخ میلادی در دیتابیس ذخیره بشه و توسط متد ها و کتابخانه های مختلف به تاریخ شمسی تبدیل بشه )
2 - برای صدور فاکتور از یه تاریخ تا یه تاریخ دیگه باید تاریخ رو صورت شمسی وارد کنید و در Back-End اون رو به تاریخ میلادی تبدیل کنید و طبق اون تاریخ میلادی به دیتابیس کوئری بزنید
3 - نمونه کد صدور فاکتور از یه تاریخ تا یه تاریخ دیگه ( البته کوئریش در لاراول ) :
$Orders = Order::whereDate('created_at', '>=', $main_date_from)
->whereDate('created_at', '<=', $main_date_to)
->orderBy('id', 'desc')->get();
سوال دیگه ای بود در خدمتم @rostamzadeemran93
سلام @e.hemmati.79 وقت عالی بخیر
من بخام تاریخ رو از شمسی به میلادی تبدیل کنم برای اینکه تو دیتا بیس ثبت کنم چجوری میتونم؟ من از پکیج morilog/jalali استفاده میکنم برای تقویم فارسی ولی create_at دیتابیس میدونید دیگه timestamps هستش چجوری باید تبدیل کنم ممنون از شما
@rostamzadeemran93
واسه تبدیل تاریخ شمسی به میلادی ، میتونی از فانکشن زیر استفاده کنی
public function jalali_to_gregorian($jy, $jm, $jd, $mod = '')
{
if ($jy > 979) {
$gy = 1600;
$jy -= 979;
} else {
$gy = 621;
}
$days = (365 * $jy) + (((int)($jy / 33)) * 8) + ((int)((($jy % 33) + 3) / 4)) + 78 + $jd + (($jm < 7) ? ($jm - 1) * 31 : (($jm - 7) * 30) + 186);
$gy += 400 * ((int)($days / 146097));
$days %= 146097;
if ($days > 36524) {
$gy += 100 * ((int)(--$days / 36524));
$days %= 36524;
if ($days >= 365) $days++;
}
$gy += 4 * ((int)(($days) / 1461));
$days %= 1461;
$gy += (int)(($days - 1) / 365);
if ($days > 365) $days = ($days - 1) % 365;
$gd = $days + 1;
foreach (array(0, 31, ((($gy % 4 == 0) and ($gy % 100 != 0)) or ($gy % 400 == 0)) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) as $gm => $v) {
if ($gd <= $v) break;
$gd -= $v;
}
return ($mod === '') ? array($gy, $gm, $gd) : $gy . $mod . $gm . $mod . $gd;
}
نحوه استفاده هم به این صورت هست که شما باید سال و ماه و روز شمسی به صورت جداگانه به فانکشن پاس بدی ..
$main_date_from = $this->jalali_to_gregorian($year, $month, $day, '-') . ' ' . '00:00:00';
$main_date_to = $this->jalali_to_gregorian($year1, $month1, $day1, '-') . ' ' . '23:59:59';
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟