JavaScript Date 对象的月份索引从 0 开始

Posted

技术标签:

【中文标题】JavaScript Date 对象的月份索引从 0 开始【英文标题】:JavaScript Date Object's month index begins with 0 【发布时间】:2010-11-15 13:30:55 【问题描述】:

我的目标是以有效的方式将 mysql 中的时间戳转换为 javascript Date 对象。这是我当前的 sn-p,它将 MySQL 时间戳转换为 php 中的格式化日期:

<?php
// formats timestamp into following format: 2009, 7, 30
$date =  date("Y, n, j", strtotime($row["date"]));
?>

然后我将这个 $date 值用于使用需要 JavaScript Date 对象的 Google 图表 API 的图表:

data.setValue(<?=$count;?>, 0, new Date(<?=$date;?>));

问题在于 JavaScript Date 对象以 0 开始月份索引,因此输出总是提前 1 个月。处理这个问题最有效的方法是什么?

提前致谢!

【问题讨论】:

这篇文章的标题暗示了你对索引为零感到震惊。哈哈耸人听闻 你是对的。这个帖子是3年前的。现在回想起来,我很惊讶索引从 0 开始 =) 我认为在这种情况下您的惊讶是有道理的:零索引月份值完全不直观。 Javascript 的创建者有心不要将日值或年份值归零(没有年份 0,因此零索引的年份会减一)。为什么这个逻辑没有延续到月份列是不可理解的。 我已经搜索了整整一个月...等一下...零个月,我的意思是。人力资源管理系统。 Javascript 幽默。 【参考方案1】:

您可以为 Date 构造函数提供 mm/dd/yyyy 或 yyyy/mm/dd 格式的日期,它会转换它:

>>> new Date('7/30/2009');
Thu Jul 30 2009 00:00:00 GMT-0700 (Pacific Daylight Time)
>>> new Date('2009/7/30');
Thu Jul 30 2009 00:00:00 GMT-0700 (Pacific Daylight Time)

【讨论】:

感谢这个人。几天来我一直在愤怒,想知道为什么我的日期选择器会调用 7 月 8 月。结果有人疯了,决定用他们的指针算法来实现这一点。作为参考,因为它被询问,大多数语言中的数组从零开始的原因是由于指针运算。当您尝试查找固定宽度字符串系列的内存位置时,您基本上采用基指针,并将索引乘以单元格/字符串长度以获得指向所需值的指针。 0 * 索引 + 基指针 = 第一项的位置。 如何通过谷歌图表数据源协议所需的 JSON 响应来完成这项工作?我遇到了同样的问题,但无法像这样格式化我的回复。 JSON 不支持 Date 对象,因此 Google 添加了一个字符串扩展黑客,例如:"v":"Date(2009,7,30)" 这使得 June,但他们不支持 "v":"Date('2009/7/30')" 或类似...【参考方案2】:

恐怕您必须手动从月份数中减去额外的1。 JS Date 对象是一团糟。

【讨论】:

这正是我所害怕的。我很震惊地发现了这一点! 你震惊地发现 JS 是一堆丑陋的东西? :D @AjayPatel - '一些案例',需要详细说明吗? 记住男孩和女孩,营销人员希望我们用这种令人困惑的语言编写服务器!好吧,不是建设性的(有一个笑模式,这都是开玩笑的),但我只是想把它扔在那里。我仍然对零索引月份的不一致感到惊讶,而不是年份或日期。 如果你想在 JS Date 上大发雷霆,你不会被它困住——我强烈推荐的另一种选择是Moment.js,它包裹着原生 Date 并提供了多种功能(例如日期比较、日期算术、解析、格式化输出)。【参考方案3】:

获取Date String Representation compatible with the Google Charts DataTable中的日期点赞

"Date(2015,0,31)" // note the quotes from the json string and the 0 for January

不用遍历 php 中的查询行,你可以让 MySQL 直接像这样格式化它:

<?php
$sql = "
    SELECT 
        CONCAT('Date(', YEAR(datefield), ',', (MONTH(datefield)-1), ',', DAY(datefield), ')') AS gChartDate, 
        valuefield
    FROM 
        table 
    ORDER BY
        datefield
";
$query = $pdo->query($sql);
$fetchAll = $query->fetchAll(PDO::FETCH_NUM); // fetch in not-associative array
array_unshift($fetchAll, [['type'=>'date', 'label'=>'date'], 'value']); // add title row
$json = json_encode($fetchAll, JSON_NUMERIC_CHECK);

然后在javascript中:

var data = google.visualization.arrayToDataTable(<?php echo($json) ?>);

【讨论】:

以上是关于JavaScript Date 对象的月份索引从 0 开始的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript Date对象方法详细总结

学习笔记:javascript内置对象:日期对象

JavaScript -- 常用的日期对象和数学对象

JavaScript中的Date对象

如何将月份值从一个 Date 对象复制到另一个对象? [复制]

JavaScript&jQuery.Date对象和Time对象