1

موضوع: تاریخ شمسی برای لاراول با پکیج قدرتمند Verta

یکی از چالش های توسعه دهندگان وب در یک پروژه تبدیل تاریخ میلادی به شمسی و بالعکس میباشد ؛ برنامه نویسان فارسی زبان برای استفاده از تاریخ شمسی در برنامه‌های خود از الگوریتم تبدیل تاریخ میلادی به شمسی استفاده می کنند که برای زبان PHP و فریم ورک لاراول این الگوریتم به صورت پکیج نیز وجود دارد . Verta یک پکیج قدرتمند برای تبدیلات تاریخ شمسی به میلادی و بالعکس می باشد و شامل توابع کمکی بسیاری است که کاربران به کمک آنها به راحتی میتوانند تبدیلات تاریخ خود را انجام دهند .

زبان PHP دارای کلاسی به نام Datetime است که Verta از همین کلاس ارث بری کرده است.

پکیج قدرتمند Carbon یکی از پکیج های لاراول است که برای کار با تاریخ میلادی بسیار کاربردی است و اما وقتی بحث کار با تاریخ شمسی است این Verta است که در بین پکیج های موجود حرف اول را میزند .

دقت داشته باشید این پکیج سازگار با نسخه 5 لاراول می باشد .

نصب

برای استفاده از این پکیج باید ابتدا پکیج را دریافت و نصب کنید ؛ برای این کار ترمینال خود را بازکنید و دستور زیر را در آن وارد کنید :

composer require hekmatinasser/verta

حال باید پکیج را درون پروژه خود ثبت کنید ؛ برای این کار فایل config/app.php را باز کنید سپس به انتهای آرایه providers دستور زیر را اضافه کنید :

Hekmatinasser\Verta\VertaServiceProvider::class,

اکنون به انتهای آرایه alias دستور زیر را اضافه کنید :

'Verta' => Hekmatinasser\Verta\Verta::class,

حال میتوانید از این پکیج در پروژه خود استفاده کنید . در ادامه شما را با نحوه استفاده از این پکیج قدرتمند و توابع آن آشنا خواهم کرد :

برای استفاده از کلاس های پکیج Verta ابتدا باید در بالای کد های خود دستور زیر را اضافه کنید :

use Verta;

توابع Verta در دسته بندی های مجزا تقسیم شده است و هر دسته بندی اعمال خاصی را بر روی تاریخ انجام خواهند داد .

ایجاد تاریخ

شما میتوانید کلاس Verta را بدین صورت ایجاد کنید :

$v = verta();

$v = new Verta();

در صورتی میخواهید نسبت به تاریخ امروز ، تاریخ دیروز یا فردا را بدست آورید کافی است از دستور زیر استفاده کنید :

$v = Verta::now(); //1396-02-02 15:32:08

$v = Verta::today(); //1396-03-02 00:00:00

$v = Verta::tomorrow(); // 1396-03-03 00:00:00

$v = Verta::yesterday(); // 1396-03-01 00:00:00

در صورتی که پارامتر شما رشته ای از سال میلادی است میتوانید از دستور زیر استفاده کنید :

$v = new Verta('2016-12-27 14:12:32');

$v = Verta::instance('2016-12-25 11:12:36');

برای استفاده از عدد timestamp به شمسی ، از دستور زیر استفاده کنید :

$v = new Verta(1333857600);

برای استفاده از کلاس Datetime به شمسی ، از دستور زیر استفاده کنید :

$dt = new \Datetime();

return new Verta($dt); // 1395-12-09 15:05:56

برای استفاده از کلاس Carbon به شمسی ، از دستور زیر استفاده کنید :

$c = \Carbon::now();

return new Verta($c); // 1395-12-09 15:05:56

برای استفاده از تاریخ شمسی به صورت رشته ، از دستور زیر استفاده کنید :

$v = Verta::parse('1395-10-07 14:12:32');

$v = Verta::parse('1396 مهر 17');

$v =  Verta::parseFormat('Y n j','1396 مهر 17');

اگر پارامتر های تاریخ شما به صورت مجزا باشد تابع create برای شما این کار را انجام خواهد داد ؛ تابع create پارامتر هایی را که از شما دریافت نمیشود با تاریخ و زمان فعلی پر میکند .

return Verta::create(2016,12,25,15,20,15);

شما میتوانید بخشی از تاریخ و زمان را نیز ارسال کنید :

return Verta::createDate(2016,12,25);

return Verta::createTime(15,51,5);

تابع createGregorian مانند تابع create تاریخ میلادی را دریافت می کند .

return Verta::createJalali(1394,12,29,15,51,5);  // 1394-12-29 15:51:05

return Verta::createJalaliDate(1394,12,29); // 1394-12-29 11:18:29 set time now

return Verta::createJalaliTime(15,51,5); // 1395-12-14 15:51:05 set date now

مقادیر و مقداردهی

یکی از قابلیت‌ها خوب Verta دسترسی به هر خصوصیت از تاریخ می‌باشد ؛ شما میتوانید سال و … را به صورت یک خصوصیت دریافت کنید .

$v = verta();

return $v->year; // 1396

return $v->month; // 3

return $v->day; // 14

return $v->hour; // 14

return $v->minute; // 18

return $v->second; // 23

return $v->timestamp; // 1496557661

return $v->timezone; // Asia/Tehran

میتوانید مقدار هر یک از قسمت‌های تاریخ را نیز مقداردهی کنید ؛ شما هم به صورت مقداردهی و متد میتوانید این کار را انجام دهید .

$v = verta();

$v->year = 1395;

$v->month = 4; // set 13 for next year first month

$v->day = 25;

$v->hour = 16;

$v->minute = 50;

$v->second = 42;

$v->timestamp = 1496557661;

$v->timezone = 'Asia/Baku';

برای مقدار دهی خصوصیات با استفاده از تابع ، از دستورات زیر استفاده کنید :

$v = $v->year(1395)

$v = $v->month(4) // set 13 for next year first month

$v = $v->day(25)

$v = $v->hour(16)

$v = $v->minute(50)

$v = $v->second(42)

$v = $v->timestamp(1496557661)

$v = $v->timezone('Asia/Baku');

در صورتی که میخواهید به یکباره مقداردهی کنید از توابع زیر میتوانید استفاده کنید :

$v = $v->setDateTime(1395, 4, 25, 16, 50, 42);

$v = $v->setDateTime(1395, 4, 25, 16, 50, 42, 1569856);

$v = $v->setDate(1395, 4, 25);

$v = $v→setTimeString('12:25:48');

در صورتی که وجود هر یک مقادیر را میخواهید بررسی کنید از تابع isset استفاده کنید .

$v = verta();

echo isset($v->year); // true

echo isset($v->month); // true

echo empty($v->day); // false

echo empty($v->hour); // false

echo empty($v->minute); // false

echo empty($v->second); // false

echo isset($v->timestamp); // true

echo isset($v->timezone); // true

توابع فرم خروجی

زمانی که میخواهید تاریخ خود را چاپ کنید تابع format به شما این امکان را می‌دهد که تاریخ خود را با فرمت دلخواه دریافت کنید . وقتی یک شی از کلاس Verta را return می‌کنید به صورت پیش‌فرض فرمت خروجی به صورت زیر است :

return new Verta(); // 1395-12-12 00:18:04

شما میتوانید فرمت خروجی هنگام که return را مشخص کنید :

Verta::setStringformat('Y/n/j H:i:s');

return new Verta(); // 1395/12/12 00:11:35

برای تنظیم مجدد فرمت خروجی به حالت اولیه ، از دستور زیر استفاده کنید :

Verta::resetStringFormat();

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

$v = new Verta('2016-12-27 14:12:32');

return $v->format('Y-n-j H:i'); // 1395-10-7 14:12

return $v->format('%B %d، %Y'); // دی 07، 1395

return $v; //1395-10-07 14:12:32

فرمت های از پیش تعیین شده‌ای که در Verta مشخص شده است چاپ فرمت های رایج را آسانتر میکند :

$v = new Verta();

return $v->formatDatetime(); // 1395-12-10 23:37:26

return $v->formatDate(); // 1395-12-10

return $v->formatTime(); // 23:26:35

return $v->formatJalaliDatetime(); // 1395/12/10 23:46:09

return $v->formatJalaliDate(); // 1395/12/10

برای نمایش تاریخ به صورت میلادی ، از دستور زیر استفاده کنید :

return $v->DateTime()->format('Y-m-d H:i:s'); // 2017-05-23 23:21:02

return $v->formatGregorian('Y-m-d H:i:s'); // 2017-05-23 23:21:02

برای نمایش اختلاف تاریخ به صورت واحد زمانی ، از دستور زیر استفاده کنید درصورتی که تاریخ را وارد نکنید ، اختلاف با زمان کنونی محاسبه می شود .

return $v1->formatDifference($v2); // 12 ماه بعد

return $v1->formatDifference($v3); // 1 سال قبل

return $v1->addDays(25)->formatDifference(); // 4 هفته بعد

return $v1->subDays(6)->formatDifference(); // 6 روز قبل

return verta()->formatDifference(); // 

برای نمایش اعداد به صورت حروف ، میتوانید از دستور زیر استفاده کنید :

return $v->formatWord('Y'); // یک هزار و سیصد و نود و شش

return $v->formatWord('l dS F'); // چهارشنبه بیست و نه ام شهریور

return $v->formatWord('d F Y'); // بیست و نه شهریور یک هزار و سیصد و نود و شش

return $v->formatWord('r'); // چهارشنبه یک هزار و سیصد و نود و شش, شش, بیست و نه, بیست و دو:چهل و نه:سی و هشت +04:30

return $v->formatWord('d F ') . $v->year; //

در صورتی که بخواهید اعداد را به صورت فارسی نمایش دهید تابع persianNumbers تبدیل اعداد به فارسی را برای شما انجام خواهد داد :

return Verta::persianNumbers($v); // ۱۳۹۶-۱۰-۰۷ ۱۴:۱۲:۳۲

در صورتی که میخواهید تابع فرمت ، معادل میلادی تاریخ خود را چاپ کند از دستور زیر میتوانید استفاده کنید :

return $v->DateTime()->format('Y-m-d H:i:s'); // 2017-05-23 23:21:02

return $v->formatGregorian('Y-m-d H:i:s'); // 2017-05-23 23:21:02

تغییر تاریخ

برای اضافه یا کم کردن از تاریخ خود ، از دستور زیر استفاده کنید :

$v = verta();

return $v->addYear(); // 1396-10-07 14:12:32

return $v->addYears(4); // 1399-10-07 14:12:32

return $v->subYear(); // 1394-10-07 14:12:32

return $v->subYears(2); // 1393-10-07 14:12:32


return $v->addMonth(); // 1395-11-07 14:12:32

return $v->addMonths(5); // 1396-03-07 14:12:32

return $v->subMonth(); // 1395-09-07 14:12:32

return $v->subMonths(2); // 1395-08-07 14:12:32


return $v->addWeek(); // 1395-10-12 14:12:32

return $v->addWeeks(3); // 1395-10-26 14:12:32

return $v->subWeek(); // 1395-09-30 14:12:32

return $v->subWeeks(2); // 1395-09-27 14:12:32


return $v->addDay(); // 1395-10-08 14:12:32

return $v->addDays(3); // 1395-10-11 14:12:32

return $v->subDay(); // 1395-10-06 14:12:32

return $v->subDays(2); // 1395-09-05 14:12:32


return $v->addHour(); // 1395-10-07 15:12:32

return $v->addHours(5); // 1395-10-07 19:12:32

return $v->subHour(); // 1395-10-07 13:12:32

return $v->subHours(2); // 1395-10-07 12:12:32


return $v->addMinute(); // 1395-10-07 14:13:32

return $v->addMinutes(3); // 1395-10-07 14:15:32

return $v->subMinute(); // 1395-10-07 14:11:32

return $v->subMinutes(2); // 1395-10-07 14:10:32


return $v->addSecond(); // 1395-10-07 14:12:33

return $v->addSeconds(3); // 1395-10-07 14:12:35

return $v->subSecond(); // 1395-10-07 14:12:31

return $v->subSeconds(2); // 1395-10-07 14:12:30

محاسبات

متدهای محاسباتی Verta همانند Carbon می باشد و شما میتوانید به تاریخ خود واحد های زمانی سال ، ماه ، هفته ، روز ، ساعت ، دقیقه و ثانیه اضافه یا کم کنید:

$v = Verta::parse('1395-10-07 14:12:32');

return $v->addYear(); // 1396-10-07 14:12:32

return $v->addYears(4); // 1399-10-07 14:12:32

return $v->subYear(); // 1394-10-07 14:12:32

return $v->subYears(2); // 1393-10-07 14:12:32


return $v->addMonth(); // 1395-11-07 14:12:32

return $v->addMonths(5); // 1396-03-07 14:12:32

return $v->subMonth(); // 1395-09-07 14:12:32

return $v->subMonths(2); // 1395-08-07 14:12:32


return $v->addWeek(); // 1395-10-12 14:12:32

return $v->addWeeks(3); // 1395-10-26 14:12:32

return $v->subWeek(); // 1395-09-30 14:12:32

return $v->subWeeks(2); // 1395-09-27 14:12:32


return $v->addDay(); // 1395-10-08 14:12:32

return $v->addDays(3); // 1395-10-11 14:12:32

return $v->subDay(); // 1395-10-06 14:12:32

return $v->subDays(2); // 1395-09-05 14:12:32


return $v->addHour(); // 1395-10-07 15:12:32

return $v->addHours(5); // 1395-10-07 19:12:32

return $v->subHour(); // 1395-10-07 13:12:32

return $v->subHours(2); // 1395-10-07 12:12:32


return $v->addMinute(); // 1395-10-07 14:13:32

return $v->addMinutes(3); // 1395-10-07 14:15:32

return $v->subMinute(); // 1395-10-07 14:11:32

return $v->subMinutes(2); // 1395-10-07 14:10:32


return $v->addSecond(); // 1395-10-07 14:12:33

return $v->addSeconds(3); // 1395-10-07 14:12:35

return $v->subSecond(); // 1395-10-07 14:12:31

return $v->subSeconds(2); // 1395-10-07 14:12:30

برای بدست آوردن تاریخ شروع و پایان هر بازه زمانی ، از دستور زیر استفاده کنید :

$v = verta(); // 1396-04-29 14:25:48

return $v->startDay(); // 1396-04-29 00:00:00

return $v->endDay(); // 1396-04-29 23:59:59

return $v->startWeek(); // 1396 1396-04-24 00:00:00

return $v->endWeek(); // 1396-04-30 23:59:59

return $v->startMonth(); // 1396-04-01 00:00:00

return $v->endMonth(); // 1396-04-31 00:00:00

return $v->startQuarter(); // 1396-04-01 00:00:00

return $v->endQuarter(); // 1396-06-31 23:59:59

return $v->startYear(); // 1396-01-01 00:00:00

return $v->endYear(); // 1396-12-29 23:59:59

متد های مقایسه‌ای

متد های مقایسه ای برای بررسی صحت تاریخ و زمان و مقایسه با تاریخ زمان حال وجود دارد ؛ خروجی متد isLeapYear مشخص میکند سال مورد نظر کبیسه است یا خیر؟

echo Verta::isLeapYear(1394); // false

echo Verta::isLeapYear(1395); // true

خروجی متد isValideDate و isValideTime مشخص میکند معتبر است یا خیر؟

echo Verta::isValideDate(1394, 12, 30); // false

echo Verta::isValideDate(1395, 12, 30); // true


echo Verta::isValideTime(15, 62, 50); // false

echo Verta::isValideTime(15, 12, 30); // true

توجه : متد isValideDate مخصوص تاریخ شمسی می‌باشد .

برای محاسبه اختلاف تاریخ ها با یکدیگر ، میتوانید از دستور زیر استفاده کنید :

$v1 = verta(); // 1396-03-31 22:21:40

$v2 = verta('2017-06-21 01:21:40'); // 1396-03-31 01:21:40

$v3 = verta('2017-06-20'); // 1396-03-30 15:24:53


return $v1->diffYears($v3); // -1

return $v1->diffMonths($v2); // 11

return $v2->diffMonths(); // -11 compare with now

return $v1->diffWeeks($v2); // 51

return $v1->diffDays($v3); // -372

return $v3->diffMinutes(); // 536548

return $v3->diffMinutes(); // 536548

برای مقایسه تاریخ ها با یکدیگر ، از دستور زیر استفاده کنید :

echo $v1->eq($v2); // false equalTo();

echo $v1->ne($v2); // true notEqualTo()

echo $v1->gt($v2); // true greaterThan()

echo $v1->gte($v2); // true greaterThanOrEqualTo()

echo $v1->lt($v2); // false lessThan()

echo $v1->lte($v2); // false lessThanOrEqualTo()

echo $v1->between($v2, $v3); // false

برای بررسی تاریخ از لحاظ نزدیکتر یا دورتر بودن و یا کوچکتر و بزرگتر بودن ، از دستور زیر استفاده کنید :

echo $v1->closest($v2, $v3); // return $v2 object

echo $v1->farthest($v2, $v3); // return $v3 object

echo $v1->minimum($v2); // return $v2

echo $v1->min($v2); // return $v2

echo $v1->maximum($v2); // return $v1

echo $v1->max($v2); // return $v1

برای بررسی یک تاریخ با تاریخ فعلی ، از دستور زیر استفاده کنید :

echo $v1->isWeekday(); // true

echo $v1->isWeekend(); // false

echo $v1->isYesterday(); // false

echo $v1->isToday(); // true

echo $v1->isTomorrow(); // false

echo $v1->isNextWeek(); // false

echo $v1->isLastWeek(); // false

echo $v1->isNextMonth(); // false

echo $v1->isLastMonth(); // false

echo $v1->isNextYear(); // false

echo $v1->isLastYear(); // false

echo $v1->isFuture(); // false

echo $v1->isPast(); // false

echo $v1->isPast(); // false


echo $v1->isCurrentYear(); // true

echo $v1->isSameAs('y', $v2); // true isSameYear()

echo $v1->isCurrentMonth(); // true

echo $v1->isSameMonth($v2); // true

echo $v1->isSameDay($v2); // true

echo $v1->isBirthday(); // true compare with today

echo $v1->isBirthday($v2); // true


echo $v1->isSaturday(); // false

echo $v1->isSunday(); // false

echo $v1->isMonday(); // false

echo $v1->isTuesday(); // false

echo $v1->isWednesday(); // false

echo $v1->isThursday(); // true

echo $v1->isFriday(); // false

تبدیلات

شما میتوانید تاریخ میلادی و شمسی به یکدیگر تبدیل کنید و خروجی آن آرایه ای شامل سه عدد تبدیل شده خواهد بود .

return Verta::getJalali(2015,12,25); // [1394,10,4]

return Verta::getGregorian(1394,10,4); // [2015,12,25]

شما حتی میتوانید تاریخ خود را به انواع کلاس‌های تاریخ در PHP و Carbon تبدیل کنید .

$v = Verta::parse('1395/01/05 23:50:25');

$dt = $v->DateTime();

$v = Verta::parse('1395/01/05 23:50:25');

$c = Carbon::instance($v->DateTime());

منبع: https://hekmatinasser.github.io/verta/
گیت هاب : https://github.com/hekmatinasser/verta

آلبرت اینشتین گفت: من از روزی میترسم که فناوری بر انسانیت ما پیشی بگیرد. آن روز جهان پر خواهد شد از نسل انسان های احمق.

پک کوین رایگان : http://yon.ir/MeYd8