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

时间:2014-06-12 05:32:14

标签: 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(星期日)。

有谁能告诉我为什么会这样?我不知道我在哪里做错了。

提前致谢。

3 个答案:

答案 0 :(得分:4)

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

d.toLocaleString()

d.toUTCString()

所以,你可能需要的是

d.getUTCDay()

为所有时区返回相同的结果。

答案 1 :(得分:2)

您有两个问题:

  1. 将字符串传递给Date构造函数调用Date.parse,这在很大程度上取决于实现,并且即使对于标准化部分,浏览器也不同。

  2. ISO 8601没有时区的日期在ES5中指定为treated as UTC,但有些浏览器会将其视为本地(ES6 will change that,因此应视为本地)

  3. 因此,如果您想要一致日期,请编写自己的解析器以将字符串转换为日期。大概你想要没有时区的字符串是本地的,所以:

    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在10月26日重新燃起,即燃烧。

    parseISODate('2014-05-26').getDay() // 1
    

    随处可见。

    如果您知道日期字符串始终有效并且您不关心年份,则可以使用没有上述内容的简单版本(即,不会验证日期值并将年份像0005一样转换为1905年) 1到99是:

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

答案 2 :(得分:1)

试试这个,

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并测试此代码