Почему этот алгоритм для получения даты в прошлом с отметками времени не работает? - PullRequest
0 голосов
/ 21 апреля 2020

Здесь, в stackoverflow, я нашел очень хороший и простой способ вычислить дату в прошлом с помощью отметок времени по модулю:

var timestampNow = moment().valueOf(); //get timestamp in miliseconds of current date and time
var interval1H = 60 * 60 * 1000; //this is 1 hour in miliseconds
var timestampMinus3Days = timestampNow - (timestampNow % (interval1H*24*3)); //substracts the modulo from current timestamp
alert("Calculated time: " + moment(timestampMinus3Days).format("DD.MM.YYYY HH.mm.ss"))

Но переменная timestampMinus3Days не дает мне дату за 3 дня до этого. В настоящее время, в этот момент я пишу сообщение, оно дает мне понедельник 20 апреля 00:00 утра.

Я на 100% уверен, что раньше это работало с другими датами. Но, похоже, расчет по модулю не работает, возможно, с этой определенной датой.

У кого-нибудь есть объяснения, и как улучшить код?

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Можете ли вы изменить его на

var timestampMinus3Days = timestampNow - (interval1H*24*3);
1 голос
/ 22 апреля 2020

Короткий ответ: если вы используете момент. js, то используйте его для всего расчета (см. Ниже).

Ваш алгоритм вычитания 3 дней не работает, потому что алгоритм неправильно. «Рабочая» версия кода OP находится внизу. Дано:

var timestampMinus3Days = timestampNow - (timestampNow % (interval1H * 24 * 3)); 

, где timestampNow является значением времени ECMAScript , а интервал 1H равен 3,6e6 мс.

значение времени составляет миллисекунды с 1970-01-01 UT C (эпоха ECMAScript), а % является оператором остатка, который подобен по модулю, но не совсем .

Выражение timestampNow % (interval1H*24*3) делит время с начала эпохи на 3 дня и получает остаток, поэтому вы устанавливаете новую дату на целое число, кратное 3 дням с 1 января 1970 года, а не 3 дням go. Таким образом, каждые 3 дня вычисление будет возвращать дату в течение 3 дней go, а в другие два дня - 1 или 2 дня go.

Остальное также включает время в текущем дне UT C, поэтому, если вы получаете 00:00:00, ваш часовой пояс должен быть +0 (GMT или UT C). Другие получат время, эквивалентное их смещению часового пояса, и дату за предыдущий день, если их смещение от UT C будет отрицательным.

Вот как это сделать с моментом. js и избежать путаницы со временем значения:

// 3 days ago from now
console.log(moment().subtract(3, 'days').format('DD.MM.YYYY HH.mm.ss'));

// 3 days ago at the start of the day
console.log(moment().subtract(3, 'days').startOf('day').format('DD.MM.YYYY HH.mm.ss'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>

Рабочая версия кода операции:

var timestampNow = moment().valueOf();
var interval1H = 60 * 60 * 1000;
var timestampMinus3Days = timestampNow - (timestampNow % (interval1H*24*3));
console.log("Calculated time: " + moment(timestampMinus3Days).format("DD.MM.YYYY HH.mm.ss"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
...