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 开始的主要内容,如果未能解决你的问题,请参考以下文章