javascript getDay()在美国返回错误的日期数字,但在印度返回正确的值

javascript getDay()在美国返回错误的日期数字,但在印度返回正确的值,javascript,Javascript,我试图使用javascript getDay()获取星期天的名称。我知道getDay()方法返回一周中的某一天,比如:0是星期天,1是星期一等等 var d=new Date("2014-05-26"); //this should return 1 so weekname monday. alert(d.getDay()); // in india it returns correct value 1 fine. 但当我在美国检查这段代码时,它返回了错误的数字0(星期日) 谁能告诉我为什么会

我试图使用javascript getDay()获取星期天的名称。我知道getDay()方法返回一周中的某一天,比如:0是星期天,1是星期一等等

var d=new Date("2014-05-26"); //this should return 1 so weekname monday.
alert(d.getDay()); // in india it returns correct value 1 fine.
但当我在美国检查这段代码时,它返回了错误的数字0(星期日)

谁能告诉我为什么会发生这种事??我不知道我哪里做错了


提前感谢。

日期构造函数使用UTC创建实例,这与印度和美国的当地时间不同。你可以通过比较来检查

d.toLocaleString()

所以,你可能需要的是

d.getUTCDay()
对所有时区返回相同的结果。

试试这个

var d=new Date("2014-05-26"); //this should return 1 so weekname monday.
var newDate = Date.UTC( d.getFullYear(), d.getMonth(), d.getDate());
alert(newDate.getDay()); // in india it returns correct value 1 fine.
您可以通过更改系统日期时区更改来产生相同的问题。将其设置为UTC-5/4/3或UCT+5/4/3并测试此代码

您有两个问题:

  • 将字符串传递给日期构造函数调用,这在很大程度上取决于实现,甚至对于标准化部分,浏览器之间也存在差异

  • 没有时区的ISO 8601日期在ES5中指定为,但是一些浏览器将其视为本地日期(因此应将其视为本地日期)

  • 因此,如果希望日期一致,请编写自己的解析器将字符串转换为日期。您可能希望没有时区的字符串是本地字符串,因此:

    function parseISODate(s) {
      var b = s.split(/\D/);
      var d = new Date();
      d.setHours(0,0,0,0);
      d.setFullYear(b[0], --b[1], b[2]);
      return d.getFullYear() == b[0] && d.getDate() == b[2]? d : NaN;
    }
    
    上面的函数需要一个不带时区的ISO 8601格式的日期,并将其转换为本地日期。如果日期值超出范围(如2014-02-29),则返回NaN(根据ES5)。它还纪念两位数的年份,以便
    0005-10-26
    0005年10月26日

    以及:

    到处都是

    如果您知道日期字符串始终有效且不关心年份1到99,则可以使用不包含上述内容的简化版本(即不验证日期值,并将0005年变为1905年):

    function parseISODate(s) {
      var b = s.split(/\D/);
      return new Date(b[0], --b[1], b[2]);
    }
    

    您是每次获得0(星期日)还是获得+/-1天的印度日期和时间time@Rachit你说得对。总是得到+/-1天的印度日期,这取决于你使用的浏览器。解析日期字符串不应留给日期构造函数(即)。如果2016-02-29是有效的,并且返回了错误的日期,该怎么办?@Grumpy,这不应该发生。此答案将字符串视为本地字符串。自编写以来,TC39的成员决定ISO 8601的日期没有时区,而不是本地日期(这与ISO 8601和标准的推断相反)。这又回到了建议,即您应该始终手动解析日期字符串,以便了解如何解释它们。
    parseISODate('2014-05-26').getDay() // 1
    
    function parseISODate(s) {
      var b = s.split(/\D/);
      return new Date(b[0], --b[1], b[2]);
    }