【问题标题】:JavaScript's getDate returns wrong dateJavaScript getDate 返回错误的日期
【发布时间】:2020-07-10 18:57:46
【问题描述】:

以下脚本返回 20 而不是 21!

var d = new Date("2010/03/21");
document.write(d.getDate());

我做错了什么?这是 JavaScript 错误吗?

【问题讨论】:

  • 只是为了确保我已经在这里即时测试了它tlarson.com/script,它说 21 !!!
  • 是页面上唯一的 javascript 代码吗?您可以执行其他一些代码。确实很奇怪。
  • 您的操作系统的语言/国家/地区是什么?
  • 不知道你是怎么得到这个错误的,但我是在通过无头 PhantomJS 浏览器运行 javascript 单元测试时得到的。我很高兴我找到了这个问题。我将无法像以前那样使用 parse,但至少我现在知道我并没有发疯。
  • 我发现了完全相同的情况。唯一有问题的一天是第 21 天。所有其他日期都可以正常工作。我的浏览器是 Firefox 18.0.1。

标签: javascript getdate


【解决方案1】:

Date.parse 方法取决于实现(new Date(string) 等效于 Date.parse(string))。

虽然这种格式可在现代浏览器上使用,但您不能 100% 确定浏览器会准确解释您想要的格式。

我建议您操作字符串,并使用带有年、月和日参数的 Date 构造函数:

// parse a date in yyyy-mm-dd format
function parseDate(input) {
  var parts = input.match(/(\d+)/g);
  // new Date(year, month [, date [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // months are 0-based
}

【讨论】:

  • 我发现使用 new Date("2010-03-21T00:00:00") 返回正确的日期。注意 T00:00:00 添加时间戳。
  • @ferr—ie8(可能还有其他)无法识别 ISO 8601 格式,将返回无效日期。
  • 有点晚了,但是为什么要从month属性中收回一个月?工作日期是必须的,不然就早一个月了,为什么呢?
  • @Arendax,Javascript Date 对象上的月份是从零开始的,这意味着 0=Jan、1=Feb、2=Mar 等...
  • @CMS 谢谢,但愚蠢的是我没想到这一点:)
【解决方案2】:

这是夏令时问题,因为 Date() 使用本地时间。

我住在巴西,2012 年 10 月 21 日是我国大部分地区夏令时的开始,因此巴西不存在 2012 年 10 月 21 日 0:0 到 1:0 之间的本地日期!

有些人在这里评论说它有效。发生这种情况是因为正确或错误的小时返回取决于当地用户国家/地区。

见:http://www.timeanddate.com/news/time/brazil-dst-2012.html

在巴西,2012 年 Java 认为 DST 从 10 月 14 日开始(实际上是在 1 周后开始)

var dt = new Date(2012,9,14); 
alert(dt.getHours());

产生1

见:http://www.timeanddate.com/time/dst/2013.html

解决方案是使用 UTC(协调世界时)时间,因为没有夏令时更改并且您使用一种抽象时间。在大多数实际应用中没有问题。

var dt = new Date( Date.UTC(2012, 9, 21, 8, 5, 12));
alert( (dt.getUTCMonth()+1) + '/' + dt.getUTCDate() + '/' + 
        dt.getUTCFullYear() + " " + dt.getUTCHours()+ ':' + 
        dt.getUTCMinutes() + ':' + dt.getUTCSeconds() );

如果有人不使用小时、分钟和秒,这会更容易,只需放置一个大于或等于 1 的虚拟小时值,如上所示。

【讨论】:

  • 我同意这个问题与夏令时有关,但您在示例中犯了错误。请记住,在 javascript Date 构造函数中,月份从 0 开始,因此如果要引用 Oct-21-2012,则必须创建:new date(2012,9,21);
【解决方案3】:

是否有可能将字符串参数视为 UTC 并将生成的 Date 对象视为本地时间,反之亦然?那可以把它扔掉。比较 d.getDate()d.getUTCDate()

【讨论】:

    【解决方案4】:

    时区在这里起主要作用。 Date() 函数会将您的时区添加到您作为输入提供的日期。例如:我这样输入:

    alert(new Date("2018-09-15"));
    

    我的结果是:

    2018 年 9 月 15 日星期六 05:30:00 GMT+0530(印度标准时间)

    时区+05:30 被添加到我输入的时间中(你可以在上面的结果中看到..05:30:00 被添加到日期中。现在我要说的是你是否在时区小于 0 [时区小于 0 的国家,如巴西、墨西哥、智利等国家],那么它将添加到您的日期输入中(例如:时区是 UTC−05:00。它将减去 -5:00给定的日期。

    VahidN,你得到了结果20,因为你所在的时区小于0(-1è : 00`等...)

    解决方案是将您的时区重置为 0。像这样:

    Date("2010-03-21T00:00:00").
    

    【讨论】:

    • 请按照guide正确格式化您的答案
    • 为什么ISO时间字符串会抛出错误?即2010-03-21T00:00:00.000Z2010-03-21T00:00:00.135Z ?
    【解决方案5】:

    我也通过getDate() 得到了一天的偏差,但我注意到getUTCDate() 返回预期值。在 FF 3.6.12 中发现了该问题,但在 Chrome 上运行相同的代码就可以了。

    我的调试代码:

    var date="2010-11-04";
    alert(date);
    var d = new Date(date)
    alert(d.toDateString()+": "+ d.getDate()+" UTC "+d.getUTCDate());
    

    这给出了一个输出(FireFox):

    2010 年 11 月 3 日星期三:3 UTC 4

    Chrome 没问题。因此,某处出现了问题-可能是错误,但更可能是时区/UTC参数问题。提醒我 PHP date() 将在一天中返回 23 小时,如果当天时区发生变化等。不过,如果我知道它是什么,那就麻烦了。

    【讨论】:

    • @Jack 这不是问题。
    • @Ivan 这绝对不是答案。
    【解决方案6】:

    我在浏览器地址栏写了如下代码,结果是21

    javascript:alert(new Date("2010/03/21").getDate())
    

    没有 Javascript 错误这样的东西,因为有许多 Javascript 实现,所以您需要参考特定的实现。

    我测试的实现是 Chrome 4.1.249。你的是什么?

    【讨论】:

    • 我也在 jsbin 上测试过,效果很好!它返回 21! ;-)
    • 我对 'There is no such things as a JavaScript bug' bugzilla.mozilla.org/buglist.cgi?quicksearch=javascript 这句话有异议
    • @jdk:我认为他指的是“JavaScript”有很多实现这一事实,所以一个实现中的错误可能不是“JavaScript”本身的错误,而是一个错误在实施中。所以说真的,这不是一个错误的陈述。
    • Firefox 18.0.1 中同样的问题。混乱是第 21 天。所有其他日子都很好!
    • 投了赞成票,因为我不知道你可以在地址栏中测试 JavaScript
    【解决方案7】:

    我在 Firefox 3.6 和 IE 8 中测试了这段代码:

    <script type="text/javascript">
    
    var d = new Date("2010/03/21");
    document.write(d.getDate());
    
    </script> 
    

    显示正确的日期:21

    欲了解更多信息,请查看:JavaScript Date Object

    您还可以在 Wikipedia 上阅读有关 JavaScript Compatibility considerations 的信息。

    【讨论】:

    • @Anubis:我看不到你链接的图片。
    【解决方案8】:

    当给 new Date 一个字符串日期时,该字符串需要包含时区,否则它会在不同浏览器之间(由于不同的 javascript 实现)和从机器到其他(由于本地时区的差异)解释不同)

    new Date('2017-07-31T10:00:00-0500');

    而不是

    new Date('2017-07-31T10:00:00');

    【讨论】:

    • 添加代码示例以更清楚地了解问题。
    【解决方案9】:

    http://jsbin.com/aqoki3/edit - 这里有你发布的代码我得到21。所以它不是JS错误。也许它在您的浏览器实现(JS)中存在错误。
    因此,要正确初始化您的日期变量,请使用new Date(year, month, date [, hour, minute, second, millisecond ]) (https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Date)。 这样您就可以确定这一天是 21,因为您将其隐式设置为 21。

    【讨论】:

      【解决方案10】:

      我在 firfox、safari、chrome、opera 和 IE 中得到相同的日期 (21), 我是使用字符串“2010/03/21”还是整数日期参数 (2010,2,21)。

      我使用的是 windows 机器和新版本的浏览器-

      您可以测试一下您的客户端是否从字符串中解析出不同的日期, 这是我看到问题的唯一地方。

      if(new Date("2010/03/21")- new Date(2010,2,21)){
      alert(new Date("2010/03/21"));
      } 
      

      【讨论】:

        【解决方案11】:

        确保您使用的月份为-1,如果您正在查看六月,则需要在创建时为该月执行 (6-1)

           var date_obj = new Date(y,(m-1),d);
        

        【讨论】:

          【解决方案12】:

          你不能通过传递字符串参数来创建日期对象,例如日期。

          像这样创建。

          var str_date = "2010/03/21";
          var date = new Date();
          var date_elements = str_date.split("/");
          
          date.setYear(date_elements[0]);
          date.setMonth(date_elements[1]);
          date.setDay(date_elements[2]);
          
          alert(date.toString);
          

          关注date.toString 方法。它返回完整的日期字符串。 date.getDate 只会给你那一天。

          有关 Date 对象的更多信息,请参阅 www.w3school.com

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-25
          • 2011-07-26
          • 1970-01-01
          • 1970-01-01
          • 2022-06-16
          相关资源
          最近更新 更多