JavaScript 的 getDate 返回错误的日期

IT技术 javascript getdate
2021-01-26 15:27:22

以下脚本返回 20 而不是 21!

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

我究竟做错了什么?这是一个 JavaScript 错误吗?

6个回答

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

虽然这种格式将在现代浏览器上可用,但您不能 100% 确定浏览器会准确地解释您想要的格式。

我建议您操作字符串,并使用带有年、月和日参数的 Date 构造函数:

// 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
}
@ferr-ie8(或许还有其他)不识别 ISO 8601 格式,并且会返回一个无效的日期。
2021-03-16 15:27:22
我发现使用 new Date("2010-03-21T00:00:00") 返回正确的日期。注意 T00:00:00 添加时间戳。
2021-03-30 15:27:22
@Arendax,Javascript Date 对象上的月份是从零开始的,这意味着 0=Jan、1=Feb、2=Mar 等...
2021-04-02 15:27:22
有点晚了,但是你为什么要从月份属性中收回一个月呢?必须有一个工作日期,否则太早了一个月,但为什么呢?
2021-04-07 15:27:22
@CMS 谢谢,但愚蠢的是我没有想到这一点:)
2021-04-12 15:27:22

这是一个夏令时问题,因为Date()使用本地时间。

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

有些人在这里评论说它有效。发生这种情况是因为正确或错误的返回时间取决于当地的用户国家/地区。

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

在巴西,2012 年 Java 认为 DST 从 10 月 14 日开始(实际上是在 1 周后开始)

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

产生1

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

我同意这个问题与夏令时有关,但您在示例中犯了错误。请记住,在 javascript Date 构造函数中,月份从 0 开始,因此如果您想参考 Oct-21-2012,您必须创建:new date(2012,9,21);
2021-03-24 15:27:22

是否有可能将字符串参数视为 UTC 并将结果Date对象视为本地时间,反之亦然?那可以扔掉它。比较d.getDate()d.getUTCDate()

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

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

我的结果是:

2018 年 9 月 15 日星期六 05:30:00 GMT+0530(印度标准时间)

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

VahidN,您得到结果20是因为您所在的时区小于 0(-1è : 00` 等...)

解决方案是将您的时区重置为 0像这样:

Date("2010-03-21T00:00:00").
按照指南正确格式化您的答案
2021-04-01 15:27:22
为什么 ISO 时间字符串会引发错误?2010-03-21T00:00:00.000Z2010-03-21T00:00:00.135Z
2021-04-03 15:27:22

我也得到了一天的偏差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 参数问题。提醒我date()如果当天时区发生变化等,PHP将在一天中返回 23 小时的位置。不过,如果我知道它是什么,那就麻烦了。

@Ivan 这绝对不是答案。
2021-04-01 15:27:22
@Jack 这不是问题。
2021-04-08 15:27:22