Управление временем
Как реализовать функции добавления и уменьшения времени?
var time = date('2018-02-02 12:45')
.add(16, 'hours')
.subtract(2, 'months')
.add(4, 'days')
.add(45, 'minutes');
Ход моих мыслей: я получаю на вход дату, далее я ее обрабатываю и получаю переменные( день, месяц, год, часы, минуты, секунды). Далее мне необходимо вызвать функцию add, которая будет принимать два параметра( число перевода времени, тип перевода), в функции я устанавливаю новую дату и возвращаю полученный результат. Каким образом реализовать структуру вызова методов добавления и уменьшения времени? Возможно, что кто-то может объяснить, используя Object.defineProperty, Object.getOwnPropertyDescriptor для работы с объектами? |
|
рони,
:dance: Спасибо. |
рони,
Может вы сталкивались с прохождением тестов и можете объяснить как работает assert.deepEqual?
var time = date('2018-02-02 12:45')
.add(2, 'hours')
.subtract(1, 'months')
.add(4, 'days')
.add(10, 'minutes');
assert.deepEqual(
time.value,
'2018-01-06 14:55',
'Если к дате "2018-02-02 12:45" ' +
'прибавить 2 часа, 4 дня и 10 минут, вычесть 1 месяц, ' +
'то получится "2018-01-06 14:55"'
);
|
Цитата:
не сталкивался, но видимо сравнивается похожесть обьектов, но данном случае это излишне, так как time.value это строка и достаточно assert.equal. |
рони,
если входные параметры даты - это строка, то каким образом реализовать, чтобы выходные параметры были, как объект? |
Цитата:
return this.newDate |
рони, можете на примере объяснить работу со строками и объектами? alert(time) - выводит нужную дату, alert(typeof time) - выводит object, но на самом деле вывод происходит как формат строки? каким образом assertEqual сравнивает объекты, чтобы результатом являлось true? test.js представлен ниже
// Встроенный в Node.JS модуль для проверок
var assert = require('assert');
// Подключаем свою функцию
var date = require('./index.js');
var time = date('2017-05-16 13:45')
.add(24, 'hours')
.subtract(1, 'months')
.add(3, 'days')
.add(15, 'minutes');
assert.deepEqual(
time.value,
'2017-04-20 14:00',
'Если к дате "2017-05-16 13:45" ' +
'прибавить 24 часа, 3 дня и 15 минут, вычесть 1 месяц, ' +
'то получится "2017-04-20 14:00"'
);
|
Цитата:
Цитата:
может это чем поможет Цитата:
|
рони,
Каким образом можно подставить значение свойства объекта таким образом, чтобы time.value = возвращал вычисленное значение? При value: '2017-04-20 14:00' тест проходит, но как свойству передать новое значение?
module.exports = function (date) {
var obj = {
value: '2017-04-20 14:00',
init: function(date) {
var arr = date.split(/[\s:-]/);
this.newDate = new Date(arr[0], arr[1] - 1, arr[2], arr[3], arr[4]);
return this;
},
add: function(value, type) {
if (value > 0 && type in this.method) {
return this.setValue(value, this.method[type]);
} else {
throw new TypeError("Передано неверное значение");
}
},
subtract: function(value, type) {
if (value > 0 && type in this.method) {
return this.setValueSubtract(value, this.method[type]);
} else {
throw new TypeError("Передано неверное значение");
}
},
method: {
"years": "FullYear",
"months": "Month",
"days": "Date",
"hours": "Hours",
"minutes": "Minutes"
},
setValue: function(value, method) {
this.newDate['set' + method](value + this.newDate['get' + method]());
return this;
},
setValueSubtract: function(value, method) {
this.newDate['set' + method](-value + this.newDate['get' + method]());
return this;
},
toString: function() {
var year = this.newDate.getFullYear();
var month = this.newDate.getMonth();
var day = this.newDate.getDate();
var hours = this.newDate.getHours();
var minutes = this.newDate.getMinutes();
return year + "-" + month + "-" + day + " " + hours + ":" + minutes;
},
valueOf: function() {
return +this.newDate
}
};
return obj.init(date);
};
|
Gtfuc,
не могу помочь |
спасибо:thanks:
|
Цитата:
|
var date = function (date) {
var obj = {
_value: null,
get value() {
return this+"";
},
init: function(date) {
if(date instanceof Date) this._value = date;
else {
var arr = date.split(/[\s:-]/);
this._value = new Date(Date.UTC(arr[0], arr[1] - 1, arr[2], arr[3], arr[4]));
}
return this;
},
add: function(value, type) {
if (value > 0 && type in this.method) {
return this.setValue(value, this.method[type]);
} else {
throw new TypeError("Передано неверное значение");
}
},
subtract: function(value, type) {
if (value > 0 && type in this.method) {
return this.setValueSubtract(value, this.method[type]);
} else {
throw new TypeError("Передано неверное значение");
}
},
method: {
"years": "FullYear",
"months": "Month",
"days": "Date",
"hours": "Hours",
"minutes": "Minutes"
},
setValue: function(value, method) {
this._value['setUTC' + method](value + this._value['getUTC' + method]());
return this;
},
setValueSubtract: function(value, method) {
this._value['setUTC' + method](-value + this._value['getUTC' + method]());
return this;
},
valueOf: function() {
var year = this._value.getFullYear();
var month = this._value.toLocaleString("ru",{timeZone : "UTC",month: '2-digit'});
var day = this._value.toLocaleString("ru",{timeZone : "UTC",day: '2-digit'});
var time = this._value.toLocaleString("ru",{timeZone : "UTC", hour: '2-digit', minute: '2-digit' });
var dates = year + "-" + month + "-" + day + " " + time;
return dates;
},
toString: this.valueOf,
};
return obj.init(date);
};
var time = date('2017-05-16 13:45')
.add(24, 'hours')
.subtract(1, 'months')
.add(3, 'days')
.add(15, 'minutes');
var time2 = date("2017-04-20 14:00");
alert(time);
alert(time == "2017-04-20 14:00");
alert(time+"" == time2+"");
console.log('time.value:', time.value);
console.log('time2:', time2);
Материалы для изучения: https://learn.javascript.ru/object-conversion https://learn.javascript.ru/descriptors-getters-setters P.S.: хз, ответил я на вопрос или нет, но больше ничем помочь не могу. |
Белый шум,
Спасибо. |
| Часовой пояс GMT +3, время: 11:50. |