Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   изменение времени (https://javascript.ru/forum/misc/72215-izmenenie-vremeni.html)

dany2855 16.01.2018 02:13

изменение времени
 
Помогите найти ошибки :cray: , пожалуйста!!
var time = date('2012-01-11 12:35')
    .add(24, 'hours')
    .subtract(1, 'months')
    .add(3, 'days')
    .add(15, 'minutes');

      arr = date.split(/[\s:-]/);
     
         objTime = {
          newDate: new Date (arr[0], arr[1] - 1, arr[2], arr[3], arr[4]),
        
          add: function (value, string) {

            if (value > 0) {
               if (string == 'years') {
                this.newDate.setFullYear(value + +arr[0]);
                return this;
               }
               else if (string == 'months') {
                this.newDate.setMonth(value + +arr[1]);
                return this;
               }
               else if (string == 'days') {
                this.newDate.setMonth(arr[1] - 1, value + +arr[2]);
                return this;
               }
               else if (string == 'hours') {
                this.newDate.setHours(value + +arr[3]);
                return this;
               }
               else if (string == 'minutes') {
                this.newDate.setMinutes(value + +arr[4]);
                return this;
               } else {
                return TypeError('Передано неверное значение')
               }
            } else {
              return TypeError('Передано неверное значение');
            }
        },

        substract: function (value, string) {
          if (value > 0) {
             if (string == 'years') {
              this.newDate.setFullYear(+arr[0] - value);
              return this;
             }
             else if (string == 'months') {
              this.newDate.setMonth(+arr[1] - value);
              return this;
             }
             else if (string == 'days') {
              this.newDate.setMonth(arr[1] - 1, +arr[2] - value);
              return this;
             }
             else if (string == 'hours') {
              this.newDate.setHours(+arr[3] - value);
              return this;
             }
             else if (string == 'minutes') {
              this.newDate.setMinutes(+arr[4] - value);
              return this;
             } else {
              return TypeError('Передано неверное значение')
             }
          } else {
            return TypeError('Передано неверное значение');
          }
        }
      }

     return objTime.newDate;

рони 16.01.2018 06:24

Цитата:

Сообщение от dany2855
substract(1, 'months')

:-?

dany2855 16.01.2018 16:19

Спасибо, не заметил.
Но ошибка идет еще раньше, после первого .add не возвращается объект.
"date(...).add is not a function'. В чем может быть проблема?

рони 16.01.2018 16:25

dany2855,
:-?
function Time(str) {
    var objTime = {
        init: function(str) {
            var arr = str.split(/[\s:-]/);
            this.newDate = new Date(Date.UTC(arr[0], arr[1] - 1, arr[2], arr[3], arr[4], 0, 0));
            return this;
        },
        add: function(value, string) {
            if (string in this.method) {
                return this.setValue(value, this.method[string]);
            } else {
                throw new Error("Передано неверное значение: " + string);
            }
        },
        method: {
            "years": "FullYear",
            "months": "Month",
            "days": "Date",
            "hours": "Hours",
            "minutes": "Minutes"
        },
        setValue: function(value, method) {
            this.newDate["setUTC" + method](value + this.newDate["getUTC" + method]());
            return this;
        },
        substract: function(value, string) {
            return this.add(-value, string);
        },
        toString: function() {
          return this.newDate.toLocaleString("ru",{timeZone : "UTC"});
        },
        valueOf: function() {
            return +this.newDate
        }
    };
    return objTime.init(str);
};

var str = "2012-01-11 12:35";
var time = new Time(str);
time.add(24, "hours").substract(1, "months").add(3, "days").add(15, "minutes");
alert(time);
alert(+time);

dany2855 17.01.2018 03:36

Рони, спасибо большое очень помогли! Подскажите еще, пожалуйста, как правильно задать формат отображения даты, мой вариант не рабочий(
toString: function() {
          return this.newDate.toString.ofPattern("YYYY‒MM‒DD HH:SS",new Locale ("ru"));
        },

рони 17.01.2018 04:00

Цитата:

Сообщение от dany2855
как правильно задать формат отображения даты

написать функцию, которая формирует эту строку или не велосипедить
http://momentjs.com/

рони 17.01.2018 04:22

dany2855,
function Time(str) {
    var objTime = {
        init: function(str) {
            var arr = str.split(/[\s:-]/);
            this.newDate = new Date(Date.UTC(arr[0], arr[1] - 1, arr[2], arr[3], arr[4], 0, 0));
            return this;
        },
        add: function(value, string) {
            if (string in this.method) {
                return this.setValue(value, this.method[string]);
            } else {
                throw new Error("Передано неверное значение: " + string);
            }
        },
        method: {
            "years": "FullYear",
            "months": "Month",
            "days": "Date",
            "hours": "Hours",
            "minutes": "Minutes"
        },
        setValue: function(value, method) {
            this.newDate["setUTC" + method](value + this.newDate["getUTC" + method]());
            return this;
        },
        substract: function(value, string) {
            return this.add(-value, string);
        },
        toString: function() {
     var year = this.newDate.getUTCFullYear();
     var month = this.newDate.toLocaleString("ru",{timeZone : "UTC",month: '2-digit'});
     var day = this.newDate.toLocaleString("ru",{timeZone : "UTC",day: '2-digit'});
     var time = this.newDate.toLocaleString("ru",{timeZone : "UTC", hour: '2-digit', minute: '2-digit' });
     return year + "-" + month + "-" + day + " "+time

        },
        valueOf: function() {
            return +this.newDate
        }
    };
    return objTime.init(str);
};

var str = "2012-01-11 12:35";
var time = new Time(str);
time.add(24, "hours").substract(1, "months").add(3, "days").add(15, "minutes");
alert(time);
alert(+time);

dany2855 19.01.2018 05:11

Рони, спасибо, за время, которое вы уделили! не могу разобраться только с еще одним вопросом. Если в задании не строка str. а объект
var str=date("2012-01-11 12:35")
, нужно приводить date к строке через toString?
var str=new String(date);
return str.toString();
Заранее большое спасибо!

рони 19.01.2018 05:38

dany2855,
function Time(str) {
    var objTime = {
        init: function(str) {
            if(str instanceof Date) this.newDate = str;
            else {
            var arr = str.split(/[\s:-]/);
            this.newDate = new Date(Date.UTC(arr[0], arr[1] - 1, arr[2], arr[3], arr[4], 0, 0));
            }
            return this;
        },
        add: function(value, string) {
            if (string in this.method) {
                return this.setValue(value, this.method[string]);
            } else {
                throw new Error("Передано неверное значение: " + string);
            }
        },
        method: {
            "years": "FullYear",
            "months": "Month",
            "days": "Date",
            "hours": "Hours",
            "minutes": "Minutes"
        },
        setValue: function(value, method) {
            this.newDate["setUTC" + method](value + this.newDate["getUTC" + method]());
            return this;
        },
        substract: function(value, string) {
            return this.add(-value, string);
        },
        toString: function() {
     var year = this.newDate.getUTCFullYear();
     var month = this.newDate.toLocaleString("ru",{timeZone : "UTC",month: '2-digit'});
     var day = this.newDate.toLocaleString("ru",{timeZone : "UTC",day: '2-digit'});
     var time = this.newDate.toLocaleString("ru",{timeZone : "UTC", hour: '2-digit', minute: '2-digit' });
     return year + "-" + month + "-" + day + " "+time

        },
        valueOf: function() {
            return +this.newDate
        }
    };
    return objTime.init(str);
};

//var str = "2012-01-11 12:35";
var str = new Date(Date.UTC(2012, 0, 11, 12, 35, 0, 0))
var time = new Time(str);
time.add(24, "hours").substract(1, "months").add(3, "days").add(15, "minutes");
alert(time);
alert(+time);


Часовой пояс GMT +3, время: 03:09.