Как сопоставить дату начала и окончания даты [дубликат]

Это не ошибка дизайна . Любой, кто совершает это, делает что-то неправильно.

Есть три случая, когда я вижу, где вы можете столкнуться с этой проблемой:

  1. Вы намерены изменить аргумент как сторону эффект функции. В этом случае никогда не имеет смысла иметь аргумент по умолчанию. Единственное исключение - когда вы злоупотребляете списком аргументов, чтобы иметь функциональные атрибуты, например. cache={}, и вы не должны были бы вызывать функцию с фактическим аргументом вообще.
  2. Вы намерены оставить аргумент немодифицированным, но вы случайно сделали изменить его , Это ошибка, исправьте ее.
  3. Вы намерены изменить аргумент для использования внутри функции, но не ожидали, что изменение будет доступно для просмотра вне функции. В этом случае вам нужно сделать копию аргумента, независимо от того, был ли он по умолчанию или нет!

Пример в вопросе может относиться к категории 1 или 3. Нечетно, что он изменяет переданный список и возвращает его; вы должны выбрать тот или другой.

157
задан Bdfy 26 December 2011 в 16:28
поделиться

7 ответов

var start = new Date();
start.setHours(0,0,0,0);

var end = new Date();
end.setHours(23,59,59,999);

alert( start.toUTCString() + ':' + end.toUTCString() );

Если вам нужно получить время UTC от них, вы можете использовать UTC().

304
ответ дан tvanfosson 20 August 2018 в 18:10
поделиться
  • 1
    Я бы рекомендовал var end = new Date(start.getTime()); убедиться, что у вас есть тот же момент времени - в случае, если вы меняете даты между начальной и конечной инициализацией - это может произойти - просто хорошая привычка – Martyn Davis 31 January 2017 в 04:07
  • 2
    @MartynDavis, когда все нормально работает, обычно около 0-2 тиков происходит между ними, но зависит от того, насколько занят процессор, поэтому имеет смысл сделать это, если вы беспокоитесь о точности 1 тика. – Jason Sebring 22 April 2017 в 16:16
  • 3
    Я бы также рекомендовал использовать setUTCHours вместо setHours, чтобы получить универсальное время – sidonaldson 12 June 2017 в 11:39

Если вас интересуют только временные метки, вы также можете сделать это, что удобно адаптировать для разных интервалов (час: 1000 * 60 * 60, 12 часов: 1000 * 60 * 60 * 12 и т. д.)

const interval = 1000 * 60 * 60 * 24; // 24 hours in milliseconds

let startOfDay = Math.floor(Date.now() / interval) * interval;
let endOfDay = startOfDay + interval - 1; // 23:59:59:9999
2
ответ дан afinemonkey 20 August 2018 в 18:10
поделиться

Используя библиотеку momentjs , это может быть достигнуто с помощью методов startOf() и endOf() объекта текущей даты момента, передавая строку 'day' в качестве аргументов:

Местный GMT:

var start = moment().startOf('day'); // set to 12:00 am today
var end = moment().endOf('day'); // set to 23:59 pm today

Для UTC:

var start = moment.utc().startOf('day'); 
var end = moment.utc().endOf('day'); 
165
ответ дан chridam 20 August 2018 в 18:10
поделиться
  • 1
    momentjs - это универсальный магазин для всех связанных с JavaScript манипуляций временем. Всегда стоит импорт. – Daniel F 29 December 2015 в 14:33
  • 2
    И мы должны использовать .toDate() в конце, чтобы получить дату. var end = moment().endOf('day').toDate(); – YaTaras 28 November 2016 в 11:48
  • 3
    добавьте .unix() в конец, чтобы получить временную метку unix в секундах :) вот так: moment().startOf('day').unix() – Lukas 13 July 2017 в 18:58
  • 4
    момент js каким-то образом не работает, если у меня есть предопределенный объект Date, например. moment(new Date()).endOf("day"); не работает, но moment().endOf("day"); работает. – B. Kemmer 19 September 2017 в 05:56
  • 5
    @KlasMellbourn Чтобы получить начало дня для определенного часового пояса, вы можете использовать moment-timezone и сделать это: moment().tz('America/Chicago').startOf('day').toDate(). – Chad Johnson 7 March 2018 в 00:41
function getTime(zone, success) {

    var url = 'http://json-time.appspot.com/time.json?tz=' + zone,
        ud = 'json' + (+new Date());
    window[ud]= function(o){
        success && success(new Date(o.datetime));
    };
    document.getElementsByTagName('head')[0].appendChild((function(){
        var s = document.createElement('script');
        s.type = 'text/javascript';
        s.src = url + '&callback=' + ud;
        return s;
    })());
}

getTime('GMT', function(time){

    // This is where you do whatever you want with the time:
    alert(time);
});

Ссылка: Получение текущего времени по Гринвичу

-7
ответ дан Community 20 August 2018 в 18:10
поделиться

Я предпочитаю использовать библиотеку date-fns для обработки даты. Это действительно отличный модульный и последовательный инструмент. Вы можете получить начало и конец дня следующим образом:

var startOfDay = dateFns.startOfDay;
var endOfDay = dateFns.endOfDay;

console.log('start of day ==> ', startOfDay(new Date('2015-11-11')));
console.log('end of day ==> ', endOfDay(new Date('2015-11-11')));
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>

1
ответ дан Mikhail Shabrikov 20 August 2018 в 18:10
поделиться

Используя библиотеку luxon.js , то же самое можно достичь с помощью методов startOf и endOf, передав параметр «день» в качестве параметра

var DateTime = luxon.DateTime;
DateTime.local().startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z
DateTime.local().endOf('day').toUTC().toISO(); //2017-11-17T18:29:59.999Z
DateTime.fromISO(new Date().toISOString()).startOf('day').toUTC().toISO(); //2017-11-16T18:30:00.000Z

remove .toUTC (), если вам нужно только локальное время

, и вы можете спросить, почему не moment.js , для этого здесь здесь .

2
ответ дан tk120404 20 August 2018 в 18:10
поделиться
0
ответ дан Musa 31 October 2018 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: