## Installation

Enter the following command to install Verta

    $ composer require hekmatinasser/verta

You can add the package to your project by entering the following command

    // config/app.php
    'providers' => [
        ...
        Hekmatinasser\Verta\Laravel\VertaServiceProvider::class,
    ],

    'alias' => [
        ...
        'Verta' => Hekmatinasser\Verta\Verta::class,
    ]

## Usage

Use the following command at the top of each file of the use Verta class

    use Verta;
    // or
    use Hekmatinasser\Verta\Verta;

## Creator

To get the current datetime, use the following command

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

To get the current date and time, use the following command

    $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

To get the current date and time similar datetime string, use the following command

    $v = new Verta('now'); // 1399-06-18 15:32:08
    $v = new Verta('-1 day'); //1399-06-17 15:07:04
    $v = new Verta('+1 month'); //1399-07-17 16:51:09
    $v = new Verta('next friday'); //1399-06-21 00:00:00
    $v = new Verta('last sunday'); //1399-06-16 00:00:00

To convert your Gregorian datetime, use the following command

    $v = new Verta('2016-12-27 14:12:32');
    $v = Verta::instance('2016-12-25 11:12:36');
    $v = Facades\Verta::instance('2016-12-25 11:12:36');

To use the timestamp number, use the following command

    $v = new Verta(1333857600);

To use the Datetime class PHP, use the following command

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

To use the Carbon class, use the following command

    $c = \Carbon::now();
    return verta($c); // 1395-12-09 15:05:56
    // or
    \Illuminate\Support\Carbon::now()->toJalali(); // 1395-12-09 15:05:56
    // or with laravel helper
    now()->toJalali(); // 1395-12-09 15:05:56
    // or in models
    return $model->created_at->toJalali();

To use the jalali datetime as a string, use the following command

    $v = Verta::parse('1395-10-07 14:12:32');
    $v = Verta::parse('1396 مهر 17');
    $v =  Verta::parseFormat('Y n j','1396 مهر 17');

If the date values are separate, use the following commands

    return Verta::create();  // 1395-12-14 11:17:01 equal now()
    return Verta::create(2016,12,25,15,20,15);  // 1395-10-05 15:20:15
    return Verta::createDate(2016,12,25); // 1395-10-05 21:35:49 set time now
    return Verta::createTime(15,51,5); // 1396-02-31 15:51:05 set date now

    // alias create functions
    return Verta::createGregorian(2016,12,25,15,20,15);  // 1395-10-05 15:20:15
    return Verta::createGregorianDate(2016,12,25); // 1395-10-05 21:35:49 set time now
    return Verta::createGregorianTime(15,51,5); // 1396-02-31 15:51:05 set date now

To use the timestamp numeric, use the following command

    return Verta::createTimestamp(1488614023); // 1395-12-14 11:23:43

If the date jalali values are separate, use the following commands

    // get Jalali datetime
    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

## Transformations

Gregorian to Jalali date, use the following command

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

Jalali to Gregorian date, use the following command

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

Verta to Datatime PHP, use the following command

    $dt = verta()->datetime();

Verta to Carbon, use the following command

    $c = Carbon::instance($v->datetime());
    // or
    $c = $v->toCarbon();

### Property

To get property, use the following command

    $v = verta(); // 1396-03-14 14:18:23
    return $v->year; // 1396
    return $v->quarter // 1
    return $v->month; // 3
    return $v->day; // 14
    return $v->hour; // 14
    return $v->minute; // 18
    return $v->second; // 23
    return $v->micro; // 0
    return $v->dayOfWeek; // 1
    return $v->dayOfYear; // 107
    return $v->weekOfYear; // 16
    return $v->daysInMonth; // 31
    return $v->timestamp; // 1496557661
    return $v->timezone; // Asia/Tehran

To set property, use the following command

    $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';

To set property with method, use the following command

    $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');

To set property together, use the following command

    $v = $v->setDateTime(1395, 4, 25, 16, 50, 42);
    $v = $v->setDateTime(1395, 4, 25, 16, 50, 42, 1569856);
    $v = $v->setDateJalali(1395, 4, 25);
    $v = $v->setTimeString('12:25:48');

## Format

To output format, use the following command

    $v = verta();
    return $v->format('Y-n-j H:i'); // 1395-10-7 14:12
    return $v->format('%B %d، %Y'); // دی 07، 1395
    return $v->format('%Q %Y'); // زمستان 1395
    return $v; //1395-10-07 14:12:32

Read the PHP manual to create the format you want

strftime date

To default output format, use the following command

    Verta::setStringformat('Y/n/j H:i:s');
    return verta(); // 1395/12/12 00:11:35

To reset output format, use the following command

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

To display the datetime in standard formats, use the following command

    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

To output format Gregorian, use the following command

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

To display the date difference as a unit of time, use the following command

If you do set parameter, the difference is calculated with the current time

    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(); // الان

To display numbers in alphabetical order, use the following command

    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; // بیست و نه شهریور 1396

## Modification

To add or sub datetime, use the following command

    $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

To get start or end datetime period, use the following command

    $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

## Comparison

To validate datetime, use the following command

    return Verta::isLeapYear(1394); // false
    return Verta::isValidDate(1394, 12, 30); // false
    return Verta::isValidTime(15, 12, 30); // true

To difference datetime together, use the following command

    // diff objects together
    $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->diffSeconds(); // 12261931

To compere datetime together, use the following command

    return $v1->eq(); // ture alias equalTo()
    return $v1->ne($v2); // true alias notEqualTo()
    return $v1->gt($v2); // true alias greaterThan()
    return $v1->gte($v2); // true alias greaterThanOrEqualTo()
    return $v1->lt($v2); // false alias lessThan()
    return $v1->lte($v2); // false alias lessThanOrEqualTo()
    return $v1->between($v2, $v3); // false

To compere datetime for closest, farthest, min or max together, use the following command

    return $v1->closest($v2, $v3); // return $v2 object
    return $v1->farthest($v2, $v3); // return $v3 object
    return $v1->minimum($v2); // return $v2
    return $v1->min($v2); // return $v2
    return $v1->maximum($v2); // return $v1
    return $v1->max($v2); // return $v1

To compere datetime now, use the following command

    return $v1->isWeekday(); // true
    return $v1->isWeekend(); // false
    return $v1->isYesterday(); // false
    return $v1->isToday(); // true
    return $v1->isTomorrow(); // false
    return $v1->isNextWeek(); // false
    return $v1->isLastWeek(); // false
    return $v1->isNextMonth(); // false
    return $v1->isLastMonth(); // false
    return $v1->isNextYear(); // false
    return $v1->isLastYear(); // false
    return $v1->isFuture(); // false
    return $v1->isPast(); // false

    return $v1->isCurrentYear(); // true
    return $v1->isSameAs('y', $v2); // true isSameYear()
    return $v1->isCurrentMonth(); // true
    return $v1->isSameMonth($v2); // true
    return $v1->isSameDay($v2); // true
    return $v1->isBirthday(); // true compare with today
    return $v1->isBirthday($v2); // true

    return $v1->isSaturday(); // false
    return $v1->isSunday(); // false
    return $v1->isMonday(); // false
    return $v1->isTuesday(); // false
    return $v1->isWednesday(); // false
    return $v1->isThursday(); // true
    return $v1->isFriday(); // false

## Laravel Validator

You can validate form with Validator Laravel

You need to define error messages for jdate, ... rules in validation.php in lang folders.

    'jdate' => 'The :attribute is not valid Jalali date',
    'jdate_equal' => 'The :attribute is not equal Jalali date  :date',
    'jdate_not_equal' => 'The :attribute is\'nt not equal Jalali date  :date',
    'jdatetime' => 'The :attribute is not valid Jalali datetime',
    'jdatetime_equal' => 'The :attribute is not equal Jalali datetime :date',
    'jdatetime_not_equal' => 'The :attribute is\'nt not equal Jalali datetime :date',
    'jdate_after' => 'The :attribute must be a Jalali date after :date.',
    'jdate_after_equal' => 'The :attribute must be a Jalali date after or equal :date.',
    'jdatetime_after' => 'The :attribute must be a Jalali datetime after :date.',
    'jdatetime_after_equal' => 'The :attribute must be a Jalali datetime after or equal :date.',
    'jdate_before' => 'The :attribute must be a Jalali date before :date.',
    'jdate_before_equal' => 'The :attribute must be a Jalali date before or equal :date.',
    'jdatetime_before' => 'The :attribute must be a Jalali datetime before :date.',
    'jdatetime_before_equal' => 'The :attribute must be a Jalali datetime before or equal :date.',

    'attributes' => [
        'start_date' => 'start date',
        'expire_datetime' => 'expire datetime',
    ],

### Validation Rules

Determines if an input is a valid Jalali date with the specified format

The default format is Y/m/d

    'start_date' => 'jdate'
    'start_date' => 'jdate:Y/m/d'

Determines if an input is a valid Jalali date with the specified format and it is equal a given date

The default format is Y/m/d

    'start_date' => 'jdate_equal'
    'start_date' => 'jdate_equal:1388/01/01'
    'start_date' => 'jdate_equal:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali date with the specified format and it is not equal a given date

The default format is Y/m/d

    'start_date' => 'jdate_not_equal'
    'start_date' => 'jdate_not_equal:1388/01/01'
    'start_date' => 'jdate_not_equal:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali datetime with the specified format

The default format is Y/m/d H:i:s

    'start_date' => 'jdatetime'
    'start_date' => 'jdatetime:Y/m/d H:i:s'

Determines if an input is a valid Jalali datetime with the specified format and it is equal a given datetime

The default format is Y/m/d H:i:s

    'start_date' => 'jdatetime_equal'
    'start_date' => 'jdatetime_equal:1388/01/01 12:56:28'
    'start_date' => 'jdatetime_equal:1388/01/01 12:56:28,Y/m/d H:i:s'

Determines if an input is a valid Jalali datetime with the specified format and it is not equal a given datetime

The default format is Y/m/d H:i:s

    'start_date' => 'jdatetime_not_equal'
    'start_date' => 'jdatetime_not_equal:1388/01/01 12:56:28'
    'start_date' => 'jdatetime_not_equal:1388/01/01 12:56:28,Y/m/d H:i:s'

Determines if an input is a valid Jalali date with the specified format and it is after a given date

The default date is now

The default format is Y/m/d

    'start_date' => 'jdate_after'
    'start_date' => 'jdate_after:1388/01/01'
    'start_date' => 'jdate_after:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali datetime with the specified format and it is after or equal a given datetime

The default date is now

The default format is Y/m/d

    'start_date' => 'jdate_after_equal'
    'start_date' => 'jdate_after_equal:1388/01/01'
    'start_date' => 'jdate_after_equal:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali datetime with the specified format and it is after a given datetime

The default date is now

The default format is Y/m/d H:i:s

    'start_date' => 'jdatetime_after'
    'start_date' => 'jdatetime_after:1388/01/01'
    'start_date' => 'jdatetime_after:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali datetime with the specified format and it is after or equal a given datetime

The default date is now

The default format is Y/m/d H:i:s

    'start_date' => 'jdatetime_after_equal'
    'start_date' => 'jdatetime_after_equal:1388/01/01'
    'start_date' => 'jdatetime_after_equal:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali date with the specified format and it is before a given date

The default date is now

The default format is Y/m/d

    'start_date' => 'jdate_before'
    'start_date' => 'jdate_before:1388/01/01'
    'start_date' => 'jdate_before:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali date with the specified format and it is before or equal a given date

The default date is now

The default format is Y/m/d

    'start_date' => 'jdate_before_equal'
    'start_date' => 'jdate_before_equal:1388/01/01'
    'start_date' => 'jdate_before_equal:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali datetime with the specified format and it is before a given date-time

The default date is now

The default format is Y/m/d H:i:s

    'start_date' => 'jdatetime_before'
    'start_date' => 'jdatetime_before:1388/01/01'
    'start_date' => 'jdatetime_before:1388/01/01,Y/m/d'

Determines if an input is a valid Jalali datetime with the specified format and it is before or equal a given datetime

The default date is now

The default format is Y/m/d H:i:s

    'start_date' => 'jdatetime_before_equal'
    'start_date' => 'jdatetime_before_equal:1388/01/01'
    'start_date' => 'jdatetime_before_equal:1388/01/01,Y/m/d'

Can combine the rules of the between the two boundaries

    $validate = Validator::make([
        'start_date' => '1389/01/31',
        'expire_datetime' => '1397/02/16 12:10:00',
    ],
    [
        'start_date' => 'required|jdate:Y/m/d|jdate_after:1388/01/01,Y/m/d|jdate_before:1390/01/01',
        'expire_datetime' => 'required|jdatetime|jdatetime_after:1397/02/16 12:09:50,Y/m/d H:i:s|jdatetime_before:1397/02/16 12:11:00',
    ]);

    if ($validate->fails()) {
        dd($validate->messages()->toArray());
    }

        //output
    array:2 [
      "start_date" => array:1 [
        0 => "The start date must be a Jalali date before 1390/01/01."
      ]
      "expire_datetime" => array:1 [
        0 => "The expire datetime must be a Jalali datetime before 1397/02/16 12:10:00."
      ]
    ]

## Traslation

You can show weekdays, months , messages in the languages available in Verta To view supported languages, go to the folder langs

To set locale, use the following command

    Verta::setLocale('fa');

To get current locale, use the following command

    Verta::getLocale(); // fa

To reset locale to fa, use the following command

    Verta::resetLocale();