代码之家  ›  专栏  ›  技术社区  ›  VahidN

javascript的getdate返回错误的日期

  •  42
  • VahidN  · 技术社区  · 15 年前

    下面的脚本返回20而不是21!

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

    我做错什么了?这是一个javascript错误吗?

    12 回复  |  直到 7 年前
        1
  •  52
  •   Christian C. Salvadó    15 年前

    这个 Date.parse 方法依赖于实现( new Date(string) 相当于 Date.parse(string) )

    虽然此格式在现代浏览器上可用,但您不能百分之百确定浏览器将准确解释您所需的格式。

    我建议您操作字符串,并使用带有year、month和day参数的日期构造函数:

    // 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
    }
    
        2
  •  29
  •   Paulo Buchsbaum    7 年前

    这是夏令时问题,因为 数据() 使用当地时间。

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

    有人在这里评论说它是有效的。这是因为正确或错误的返回时间取决于本地用户所在的国家。

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

    在巴西,2012 Java认为DST从OCT-14开始(实际上是在1周后开始)。

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

    生产

    见: 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的虚拟小时值,就更容易了,如我上面所示。

        3
  •  15
  •   eyelidlessness    15 年前

    如果它将字符串参数视为utc,那么 Date 对象作为本地时间,反之亦然?这可能会把它扔掉。比较 d.getDate() d.getUTCDate() .

        4
  •  4
  •   Ivan Jeffrey Zhao    7 年前

    我还有一天的偏差 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

    铬很好。所以有些事情发生了-也许是个错误,但更有可能是时区/utc参数问题。让我想起php date() 如果时区在一天内改变,我会在一天内返回23个小时。如果我知道是什么,我会很生气。

        5
  •  2
  •   Jader Dias    15 年前

    我在浏览器的地址栏中编写了以下代码,结果是 21

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

    没有javascript bug,因为有很多javascript实现,所以您需要引用一个特定的实现。

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

        6
  •  1
  •   Leniel Maccaferri    15 年前

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

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

    它显示了正确的日期:21

    有关更多信息,请查看: JavaScript Date Object

    你也可以阅读 JavaScript Compatibility considerations 在维基百科。

        7
  •  1
  •   Steven Bala    7 年前

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

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

    对我来说结果是: 2018年9月15日星期六05:30:00 GMT+0530(印度标准时间)

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

    VahidN ,你得到了结果 20 因为你的时区小于0( -1è : 00’等。

    解决办法是 将时区重置为0 . 这样地:
    日期(“2010-03-21t00:00:00”)。

        8
  •  0
  •   NilColor    15 年前

    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。

        9
  •  0
  •   kennebec    15 年前

    我在Firfox,Safari,Chrome,Opera和IE里有同样的约会 无论我使用字符串“2010/03/21”还是整数日期参数(2010,2,21)。

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

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

    if(new Date("2010/03/21")- new Date(2010,2,21)){
    alert(new Date("2010/03/21"));
    } 
    
        10
  •  0
  •   CG_DEV    11 年前

    确保您使用的月数为-1,如果您查看的是六月,则在创建

       var date_obj = new Date(y,(m-1),d);
    
        11
  •  0
  •   Anis Dkhil    8 年前

    当给新日期一个字符串日期时,该字符串需要包含时区,否则它将被不同的浏览器解释为其他(由于不同的javascript实现)和不同的机器解释为其他(由于本地时区的不同)

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

    而不是

    new Date('2017-07-31T10:00:00');
        12
  •  -2
  •   Jay D    13 年前

    不能通过传递字符串参数shows like date来创建日期对象。

    这样创造。

    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 只会给你那一天。

    有关日期对象的详细信息,请访问www.w3school.com