Nodejs中moment.js的一个小问题

Nodejs中moment.js的一个小问题

var day = new Date(2011, 9, 16);
var dayWrapper = moment(day); console.log( ‘day:’ + dayWrapper.format(‘YYYY-MM-DD’));

结果:day:2011-10-16 这样的创建,为什么会变成10月?

4 回复

当然可以。让我们来详细分析一下这个问题,并提供一个解决方案。

问题描述

在您的代码中,您使用 new Date(2011, 9, 16) 创建了一个日期对象,然后使用 moment 将其转换为一个 Moment.js 对象,并尝试以特定格式输出。但是,输出的月份显示为 10 月,而不是预期的 9 月。

问题原因

问题的关键在于 JavaScript 的 Date 对象中的月份是从 0 开始计数的。这意味着:

  • 0 表示 1 月
  • 1 表示 2 月
  • 9 表示 10 月

因此,当您传递 9Date 构造函数时,它实际上表示的是 10 月。

解决方案

为了确保正确地设置月份,您可以将月份值从 9 更改为 8。以下是修改后的代码:

const moment = require('moment');

// 注意月份是从 0 开始的
var day = new Date(2011, 8, 16); // 月份从 0 开始,8 表示 9 月
var dayWrapper = moment(day);
console.log('day: ' + dayWrapper.format('YYYY-MM-DD')); // 输出: day: 2011-09-16

示例代码

这里是一个完整的示例代码,展示如何正确设置月份并输出日期:

const moment = require('moment');

// 使用正确的月份值
var day = new Date(2011, 8, 16); // 月份从 0 开始,8 表示 9 月
var dayWrapper = moment(day);

console.log('day: ' + dayWrapper.format('YYYY-MM-DD')); // 输出: day: 2011-09-16

通过以上修改,您可以确保输出的日期是正确的。希望这能解决您的问题!


var day = new Date(‘2011-9-16’); 就是对的。

month从0开始

在Node.js中使用moment.js时,需要注意月份是从0开始计数的。也就是说,0代表1月,1代表2月,以此类推。因此,在你的例子中,new Date(2011, 9, 16)中的9实际上表示的是10月,而不是9月。

示例代码

var moment = require('moment');

// 创建一个新的Date对象,注意月份从0开始计数
var day = new Date(2011, 8, 16); // 9月16日

// 使用moment.js包裹Date对象
var dayWrapper = moment(day);

// 输出格式化的日期
console.log('day:', dayWrapper.format('YYYY-MM-DD')); // 输出:day: 2011-09-16

解释

  • new Date(2011, 9, 16)中的9表示10月,因为月份是从0开始计数的。
  • 修改为new Date(2011, 8, 16)后,9月16日被正确地解析,并且使用moment.js格式化输出为2011-09-16

如果你希望更直观地理解月份,可以直接使用字符串形式来创建日期:

var day = moment("2011-09-16").toDate();
var dayWrapper = moment(day);
console.log('day:', dayWrapper.format('YYYY-MM-DD')); // 输出:day: 2011-09-16

这样可以避免因月份计数导致的混淆。

回到顶部