Управление временем
Как реализовать функции добавления и уменьшения времени?
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); }; |
Часовой пояс GMT +3, время: 17:15. |