我试图使用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(星期日)。
有谁能告诉我为什么会这样?我不知道我在哪里做错了。
提前致谢。
答案 0 :(得分:4)
日期构造函数使用UTC创建实例,这与印度和美国的本地时间不同。您可以通过比较来检查
d.toLocaleString()
和
d.toUTCString()
所以,你可能需要的是
d.getUTCDay()
为所有时区返回相同的结果。
答案 1 :(得分:2)
您有两个问题:
将字符串传递给Date构造函数调用Date.parse,这在很大程度上取决于实现,并且即使对于标准化部分,浏览器也不同。
ISO 8601没有时区的日期在ES5中指定为treated as UTC,但有些浏览器会将其视为本地(ES6 will change that,因此应视为本地)
因此,如果您想要一致日期,请编写自己的解析器以将字符串转换为日期。大概你想要没有时区的字符串是本地的,所以:
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并测试此代码