PersianDate icon indicating copy to clipboard operation
PersianDate copied to clipboard

String Array Input & String Input (+Solution)

Open PAPIONbit opened this issue 4 years ago • 0 comments

Hi dear Babakhani First, thanks for this useful library.

Second: I have an String input like this: 1399-02-10 It should be Parse from value of a <Input type="text"... So sure the input value is String. I need to set it on persianDate() but There is no generic way for that.

Expected Behavior

  • A) I can set it as an array like this : var d = new persianDate(Input.value.split('-'));

or

  • B) I can set it as a standard time string value like 1399-02-01T22:10:11 var d = new persianDate(Input.value);

Current Behavior

  • A) It will not respond or It will show a wrong date (In older version). because the format of the array is String.

or

  • B) Almost no option. Note: The Date can do it. var d = new Date('2019-10-11T20:10:00');

Possible Solution

A) Instead of every time converting values to string, just convert it in the main function. By changing the setup function to this:

_createClass(PersianDateClass, [{
    key: 'setup',
    value: function setup(input) {
        // Convert Any thing to Gregorian Date
        if (TypeChecking.isDate(input)) {
            this._gDateToCalculators(input);
        } else if (TypeChecking.isArray(input)) {


        // Removing invalid detector & Adding parseInt() for every input
            this.algorithmsCalc([parseInt(input[0]), input[1] ? parseInt(input[1]) : 1, input[2] ? parseInt(input[2]) : 1, input[3] ? parseInt(input[3]) : 0, input[4] ? parseInt(input[4]) : 0, input[5] ? parseInt(input[5]) : 0, input[6] ? parseInt(input[6]) : 0]);



        } else if (TypeChecking.isNumber(input)) {
            var fromUnix = new Date(input);
            this._gDateToCalculators(fromUnix);
        }

... B) In next Accepting strings that have possible characters by a code like this:

        // instance of pDate
        else if (input instanceof PersianDateClass) {
                this.algorithmsCalc([input.year(), input.month(), input.date(), input.hour(), input.minute(), input.second(), input.millisecond()]);
            }
            // ASP.NET JSON Date
            else if (input && input.substring(0, 6) === '/Date(') {
                    var fromDotNet = new Date(parseInt(input.substr(6)));
                    this._gDateToCalculators(fromDotNet);


                  // String value
		} else if (RegExp(/[\\\/T\-\_\.\:\s\,\;\"\'\(\)\[\]\!\+]/g).test(String(input))) {
			input=String(input).replace(/[\u0660-\u0669\u06f0-\u06f9]/g,function (c){return c.charCodeAt(0)&0xf;}).replace(/[\\\/T\-\_\.\:\s\,\;\"\'\(\)\[\]\!\+]+/g,'-').split('-');
			this.algorithmsCalc([parseInt(input[0]), input[1] ? parseInt(input[1]) : 1, input[2] ? parseInt(input[2]) : 1, input[3] ? parseInt(input[3]) : 0, input[4] ? parseInt(input[4]) : 0, input[5] ? parseInt(input[5]) : 0, input[6] ? parseInt(input[6]) : 0]);



                } else {
                    var now = new Date();
                    this._gDateToCalculators(now);
                }
    }

Explain: Finding any possible characters that can be in date formats like:

1382/11/10 1357-11-12 "20'20 '1389 12 12' ۱۳۶۹-۱۰-۲۱

Detecting by RegEx, if is there, convert all (Persian/Arabic number to English &) All other characters to Dash and also removing double dashes. Then split them in an array by split()

Sure my coding is not perfect on your library but i think something close to this can be useful.

Best Regards.

PAPIONbit avatar May 06 '20 13:05 PAPIONbit