Установка значения длинного числа и времени для даты на полночь - PullRequest
0 голосов
/ 30 мая 2020

Все, я пытаюсь установить временную составляющую заказа. Поле OrderDate определяется следующим образом:

{
    "OrderDate" : {
        "DateTime" : ISODate("2017-11-29T00:00:00.000+00:00"),
        "Ticks" : 636475104000000000
    }
}

I wi sh для обновления OrderDate, который имеет ненулевой компонент времени, чтобы иметь компоненты времени 00: 00: 00.000+ 00:00. Порядок, в котором я sh меняю, выглядит так:

{
    "OrderDate" : {
        "DateTime" : ISODate("2020-04-17T01:52:14.280+01:00"),
        "Ticks" : 637226815342800000
    }
}

Я хочу, чтобы это тоже выглядело

"OrderDate" : {
    "DateTime" : ISODate("2020-04-17T00:00:00.000+00:00"),
    "Ticks" : 636475104000000000
}

Я пытаюсь использовать функцию

function (order) 
{
    const midnightTime = new Date(0, 0, 0, 0, 0, 0, 0);
    print("midnightTime = " , midnightTime.toLocaleString());
    print("orderTime = " , order.OrderDate.DateTime.toLocaleString());

    order.OrderDate.DateTime = new Date(
        order.OrderDate.DateTime.getFullYear(), 
        order.OrderDate.DateTime.getMonth(), 
        order.OrderDate.DateTime.getDay(),
        0, 
        0,
        0, 
        0);
    print("orderTime = " , order.OrderDate.DateTime.toLocaleString());

    //order.OrderDate.Ticks = NumberLong(636475104000000000);
    db.Orders.save(order);
}

Результат:

  • midnightTime = 31/12/1899, 00:00:00
  • marketOrderTime = 17/04/2020, 01:52:14
  • marketOrderTime = 05.04.2020, 00: 00: 00

Q1. Почему у меня здесь 05.04.2020, а не 17 / 04/2020, 00:00:00 и как это исправить? Q2. Когда я раскомментирую установку тиков, я получаю

"message": "Невозможно установить свойство 'Ticks' на ноль", "stack": "script: 27: 45" + "script: 28:91 сценарий «+»: 28: 91 сценарий «+»: 9: 7 "

как установить значение Tick?

1 Ответ

1 голос
/ 31 мая 2020

Это устаревшая «особенность» ECMAScript, что значения года от 0 до 99 обрабатываются как 1900–1999, поэтому new Date(0, 0, 1) создает дату для 1900-01-01.

Если orderDate.DateTime является экземпляром Date, то для установки UT C времени на ноль просто выполните:

orderDate.DateTime.setUTCHours(0,0,0,0);

Q1. Почему я получаю 05/04/2020 здесь, а не 17/04/2020, 00: 00: 00

Потому что вы создаете дату, используя getDay , который возвращает день недели с воскресенья по субботу пронумерован от 0 до 6. Вместо этого вы должны использовать getDate .

Однако исходная дата - UT C, поэтому вам следует использовать методы UT C:

order.OrderDate.DateTime = new Date(
    order.OrderDate.DateTime.getUTCFullYear(), 
    order.OrderDate.DateTime.getUTCMonth(), 
    order.OrderDate.DateTime.getUTCDate());

Отсутствует значения обрабатываются как ноль (за исключением даты, которая равна 1). Но просто установите время на ноль, как показано выше.

Q2. Когда я раскомментирую настройку тиков, я получаю…

Сообщение сообщает вам, что order.OrderDate имеет значение null. Попробуйте

console.log(typeof order.OrderDate)

. Вам нужно опубликовать исполняемый фрагмент, демонстрирующий это.

Что такое «NumberLong»? Возможно, вы ищете BigInt ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...