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

javascript getDay() returns wrong number for a date in america but it returns correct value in india

本文关键字:返回 日期 美国 getDay 错误 javascript      更新时间:2023-09-26

我试图使用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(星期日)。

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

Date构造函数使用UTC创建一个实例,UTC与印度和美国的本地时间都不同。你可以通过比较

来检查
d.toLocaleString()

d.toUTCString()

那么,你可能需要的是

d.getUTCDay()

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

有两个问题:

  1. 将字符串传递给Date构造函数调用Date。解析,它在很大程度上依赖于实现,即使对于标准化的部分,也会因浏览器而异。

  2. 没有时区的ISO 8601日期在ES5中被指定为UTC,然而一些浏览器将它们视为本地(ES6将改变这一点,因此它们应该被视为本地)

所以如果你想要一致的日期,写你自己的解析器来把字符串转换成日期。假设您希望没有时区的字符串是本地的,因此:

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日。

:

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

无处不在。

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

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

try this,

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