Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Управление временем (https://javascript.ru/forum/misc/72569-upravlenie-vremenem.html)

Gtfuc 08.02.2018 18:46

Управление временем
 
Как реализовать функции добавления и уменьшения времени?
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 для работы с объектами?

рони 08.02.2018 19:23

Gtfuc,
:blink:
https://javascript.ru/forum/misc/722...tml#post475369

Gtfuc 08.02.2018 19:45

рони,
:dance: Спасибо.

Gtfuc 09.02.2018 00:43

рони,
Может вы сталкивались с прохождением тестов и можете объяснить как работает 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"'
);

рони 09.02.2018 09:10

Цитата:

Сообщение от Gtfuc
как работает assert.deepEqual

http://qaru.site/questions/104583/th...ing-with-mocha
не сталкивался, но видимо сравнивается похожесть обьектов, но данном случае это излишне, так как time.value это строка и достаточно assert.equal.

Gtfuc 09.02.2018 20:59

рони,
если входные параметры даты - это строка, то каким образом реализовать, чтобы выходные параметры были, как объект?

рони 09.02.2018 23:00

Цитата:

Сообщение от Gtfuc
чтобы выходные параметры были, как объект?

заменть toString и valueOf на
return this.newDate

Gtfuc 10.02.2018 00:04

рони, можете на примере объяснить работу со строками и объектами? 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"'
);

рони 10.02.2018 09:04

Цитата:

Сообщение от Gtfuc
можете на примере объяснить работу со строками и объектами?

не могу
Цитата:

Сообщение от Gtfuc
каким образом assertEqual сравнивает объекты

вероятно идёт по дереву обьекта и сравнивает все ветки, обоих обьектов (другого способа не знаю для сравнения обьектов).

может это чем поможет
Цитата:

У объектов Date есть и valueOf – возвращает количество миллисекунд, и toString – возвращает строку с датой.
Преобразование объектов: toString и valueOf

Gtfuc 10.02.2018 17:37

рони,
Каким образом можно подставить значение свойства объекта таким образом, чтобы 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);
};

рони 10.02.2018 19:04

Gtfuc,
не могу помочь

Gtfuc 10.02.2018 20:33

спасибо:thanks:

ProstoyMuzhik 17.02.2018 20:29

Цитата:

Сообщение от Gtfuc (Сообщение 477544)
спасибо:thanks:

привет Gtfuc, у тебя в итоге получилось справиться с заданием? У меня только 1 проверка проходит, какой код должен быть?

Белый шум 01.03.2018 17:05

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.: хз, ответил я на вопрос или нет, но больше ничем помочь не могу.

Gtfuc 07.03.2018 13:49

Белый шум,
Спасибо.


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