неожиданное поведение в момент js при преобразовании строки в datetime в nodejs - PullRequest
0 голосов
/ 07 июня 2018

Я хочу преобразовать '03/08/2017 01:00:01 ' в объект datetime в node.js, чтобы я мог получить конкретный день и месяц в дате.Например: месяц 08 и день 03 для приведенного выше примера.

Пожалуйста, обратитесь к приведенному ниже фрагменту кода, он дает мне результат ниже.

const myDate = moment('03/08/2017  01:00:01 '.trim(),  ['DD/MM/YYYY  hh:mm:ss'], true).utcOffset(0).toDate();
console.log(myDate); //result 2017-08-02T19:30:01.000Z
console.log(myDate.getUTCFullYear()); //result 2017
console.log(myDate.getUTCMonth()); //result 7
console.log(myDate.getUTCDay()); //result 4

далее, я попробовал ниже фрагменты кода.здесь я не смог использовать функцию .toDate() для преобразования ее в объект datetime.

let date = moment.parseZone(myDate).format('YYYY-MM-DD hh:mm:ss');
console.log(date); // result 2017-08-03 01:00:01

здесь она дает правильную дату, но я не смог извлечь из нее месяц.

let date_ = moment(new Date(date), 'DD/MM/YYYY HH:mm:ss').format('LLL');
console.log(date_); // result August 3, 2017 1:00 AM

ниже фрагмента кода также дает первый результат.Я выполнил все эти строки в одном файле

let _date = moment(new Date(date)).utc().toDate();
console.log(_date);// result 2017-08-02T19:30:01.000Z
console.log(_date.getUTCFullYear()); //result 2017
console.log(_date.getUTCMonth()); //result 7
console.log(_date.getUTCDay()); //result 3

1 Ответ

0 голосов
/ 07 июня 2018

Как указано в документации :

По умолчанию момент анализируется и отображается по местному времени.

Если вы хотите анализировать или отображать момент вUTC, вы можете использовать moment.utc () вместо moment ().

, поэтому одним из возможных подходов будет работать в UTC и выполнить:

const myDate2 = moment.utc('03/08/2017  01:00:01',  ['DD/MM/YYYY  hh:mm:ss'], true).toDate();
console.log(myDate2.getUTCDate());
console.log(myDate2.getUTCMonth() + 1);
console.log(myDate2.getUTCHours());

Обратите внимание, что вЧтобы получить номер дня, нужно позвонить getUTCDate, вместо этого getUTCDay/getDay возвращает день недели.Кроме того, номер месяца, возвращаемый getMonth/getUTCMonth, находится в диапазоне 0-11, поэтому необходимо увеличить результат на единицу.

В качестве альтернативы можно работать с локальной датой и выполнять:

const myDate1 = moment('03/08/2017  01:00:01',  ['DD/MM/YYYY  hh:mm:ss'], true).toDate();
console.log(myDate1.getDate());
console.log(myDate1.getMonth() + 1);
console.log(myDate1.getHours());
...