لاراول

- 6 ماه پیش
توسط emran rostam zade آپدیت شد
emran rostam zade ( 875 تجربه )
6 ماه پیش

سلام وقت همگی بخیر اساتید محترم اگه بخوام یه سری رکورد خاص رو بخونم چی کار باید بکنم اینجوری که یه فیلد تو جدول داشته باشم که تاریخو ثبت کنه بگم نمایش بده از این تاریخ تا این تاریخ رو
برای چاپ فاکتور میخام که هر ماه برای صصدور فاکتور مثلا کاربر وارد کن از این تاریخ تا این تاریخوو نشون بده

بهترین پاسخ انتخاب شده توسط emran rostam zade
عرفان همتی
6 ماه پیش

@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';
فخرالدین لنگی ( 7270 تجربه )
6 ماه پیش
تخصص : برنامه نویس وب، آندروید و سیستم های کامپیوتری

با سلام و خسته نباشید
شما سه راه مختلف برای اینکار دارید که دوتای اول بهینه هستن و مورد آخری خیر
روش اول :
شما می تونید از یک فیلد timestamp استفاده کنید و تاریخ رو به صورت میلادی توش ثبت کنید و هر وقت خواستید می تونید با عملگرهای کوچکتر یا بزرگنر یا مساوی عملیات مقایسه رو انجام بدید.
روش دوم :
اگه می خوایید تاریخ به صورت شمسی وارد کنید عملیات مشابه روش قبله و اینجا هم یک فیلد timestamp رو تعریف می کنید اما برای ذخیره و بازیابی از یک پکیج بیرونی مثل Verta که کار عملیات تبدیل تاریخ رو به شمسی براتون انجام می ده و مشابه روش قبل می تونید برای مقایسه هم از توابع پکیج استفاده کنید و هم از عملگرهای کوچکتر یا بزرگنر یا مساوی استفاده نمایید.
روش سوم :
که من اصلا توصیه نمی کنم اینکه تاریخ رو به صورت یک رشته (varvhar) ذخیره کنید و خودتون یک تابع برای مقایسه این کار بنویسید

emran rostam zade ( 875 تجربه )
6 ماه پیش

ممنون ولی مقدوره یکم بیشتر توضیح بدین؟ من تو لاراول تازه کارم زیاد تخصصی ندارم ممنون میشم

عرفان همتی ( 17565 تجربه )
6 ماه پیش
تخصص : Backend Developer

1 - به نظر بنده کار درستی نیست که تاریخ شمسی به صورت مستقیم در دیتابیس ذخیره بشه
( درستش اینه که تاریخ میلادی در دیتابیس ذخیره بشه و توسط متد ها و کتابخانه های مختلف به تاریخ شمسی تبدیل بشه )

2 - برای صدور فاکتور از یه تاریخ تا یه تاریخ دیگه باید تاریخ رو صورت شمسی وارد کنید و در Back-End اون رو به تاریخ میلادی تبدیل کنید و طبق اون تاریخ میلادی به دیتابیس کوئری بزنید

3 - نمونه کد صدور فاکتور از یه تاریخ تا یه تاریخ دیگه ( البته کوئریش در لاراول ) :


        $Orders = Order::whereDate('created_at', '>=', $main_date_from)
            ->whereDate('created_at', '<=', $main_date_to)
            ->orderBy('id', 'desc')->get();

سوال دیگه ای بود در خدمتم @rostamzadeemran93

عرفان همتی ( 17565 تجربه )
6 ماه پیش
تخصص : Backend Developer

واسه تبدیل تاریخ شمسی به میلادی و بالعکس میتونید از کتابخونه JDF استفاده کنید

emran rostam zade ( 875 تجربه )
6 ماه پیش

سلام @e.hemmati.79 وقت عالی بخیر
من بخام تاریخ رو از شمسی به میلادی تبدیل کنم برای اینکه تو دیتا بیس ثبت کنم چجوری میتونم؟ من از پکیج morilog/jalali استفاده میکنم برای تقویم فارسی ولی create_at دیتابیس میدونید دیگه timestamps هستش چجوری باید تبدیل کنم ممنون از شما

عرفان همتی ( 17565 تجربه )
6 ماه پیش
تخصص : Backend Developer

@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';
emran rostam zade ( 875 تجربه )
6 ماه پیش

@e.hemmati.79 خیلی ممنون از شما

برای ارسال پاسخ باید وارد سایت شوید