【问题标题】:javascript january date issuejavascript 1 月日期问题
【发布时间】:2017-02-01 13:01:42
【问题描述】:
function datecheck(){
    var dt1 = new Date();
    dt1.setUTCFullYear("2017");
    dt1.setUTCDate("1");
    dt1.setUTCMonth("1");
    alert(dt1.getUTCMonth());
}

当我执行这个函数时,我得到 0 作为警报,但如果是 setUTCMonth("2")。我得到 2 的警报。同样,如果给出 3,4,5,6,7,8...,那么它会在同一月份发出警报,那么 1 月份有什么问题?

但我也观察到如果

function datecheck(){
    var dt1 = new Date();
    dt1.setUTCFullYear("2017");
    dt1.setUTCMonth("1");
    dt1.setUTCDate("1");
    alert(dt1.getUTCMonth());
}

行为改变它在 1 被传递时开始警告 0。我完全搞不懂这是怎么回事……

谁能告诉我哪里出错了。

提前致谢。

【问题讨论】:

  • JavaScript 月份从 0 到 11。不,这没有意义。不,它不能更改,因为它会破坏向后兼容性。是的,它把我们都逼疯了。
  • 月(以及日和年)也是数字,而不是字符串。当你应该写1时,你为什么还要花额外的精力写"1"
  • @JaredSmith 我个人喜欢它 - ['Jan','Feb','Mar'....][date.getUTCMonth()] 是一个巧妙的技巧:D
  • @NiettheDarkAbsol 是的,很确定我们都曾在某个时候写过const MONTHS = [] :)

标签: javascript date monthcalendar


【解决方案1】:

你有几个问题。首先,除非你真的知道你在做什么,否则以这种方式改变Date 对象是不可取的。最好将所需的参数传递给构造函数:

var jan1 = new Date(2017, 0, 1);

请注意,我传入了零。这是因为与其他所有与日期相关的计数不同,在 JavaScript 中,月份是从 0 到 11。

其次,您忽略了时区的影响。 JavaScript 在本地时区构造 Date 对象。例如,我现在是 GMT -5。 如果我在浏览器的控制台中执行以下操作:

var dec31 = new Date(2016, 11, 31, 20); // 20hr == 8pm
dec31.getMonth();    // 11
dec31.getUTCMonth(); // 0

五个小时的偏移量将 UTC 时间推到下个月。

【讨论】:

  • 我不确定这如何回答这个问题,因为 OP 正在使用所有 [gs]etUTC* 函数...
  • @NiettheDarkAbsol 基于结果取决于调用方法的顺序做出了一些假设。有点像当你看到一些标题和正文相当复杂的问题时,但你几乎立即知道它“如何从异步请求中返回结果”只是出于本能。
  • 很公平! :D
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多