将 MySql 日期时间戳转换为 JavaScript 的日期格式

IT技术 javascript jquery mysql datetime
2021-01-23 20:30:03

有谁知道我如何获取 MySQLdatetime数据类型值,例如YYYY-MM-DD HH:MM:SS解析它或将其转换为在 JavaScript 的Date()函数中工作,例如:- Date('YYYY, MM, DD, HH, MM, SS);

谢谢!

6个回答

这里给出的一些答案要么过于复杂,要么就是行不通(至少,不是在所有浏览器中)。如果你退后一步,你会看到 MySQL 时间戳的每个时间分量都与Date()构造函数所需的参数顺序相同

所需要的只是对字符串进行非常简单的拆分:

// Split timestamp into [ Y, M, D, h, m, s ]
var t = "2010-06-09 13:12:01".split(/[- :]/);

// Apply each element to the Date function
var d = new Date(Date.UTC(t[0], t[1]-1, t[2], t[3], t[4], t[5]));

console.log(d);
// -> Wed Jun 09 2010 14:12:01 GMT+0100 (BST)

公平警告:这假设您的 MySQL 服务器正在输出 UTC 日期(这是默认值,如果字符串没有时区组件,则建议使用)。

非常感谢您提供这个优雅的解决方案!我不得不使用它,因为 Safari 似乎无法从 MySQL 时间戳字符串自动生成 Date 对象,例如。var d = new Date("2010-06-09 13:12:01");. 有趣的是,Chrome 对此没有任何问题。
2021-03-17 20:30:03
并认为其他答案建议更复杂的解决方案。非常感谢!
2021-03-23 20:30:03
@Reinsbrain:这不是错误的答案,只是不符合您要求的答案。有区别。如果实现者无法访问执行 MySQL 查询的服务器代码(可能是某种 Web 服务)怎么办?如果编辑客户端代码更容易,因为在服务器更改它意味着更多的工作怎么办?将头发分成几个字节是没有意义的,这些字节可以通过 gzip 压缩变得无关紧要,或者分割一个字符串所需的千分之几毫秒。
2021-03-26 20:30:03
呃 mysql 使用一个时区,而 javascript Date 构造函数只接受本地时区,从而使这个解决方案错误最多 24 小时......new Date(Date.UTC(...))更好,但假设 mysql 使用 utc......无论哪种方式,这都需要在此之前考虑可以认为是正确答案。
2021-03-26 20:30:03
@Kolob:我已经更新了Date.UTC建议。我在作者是否想要在 MySQL 中表示的日期或本地时区之间纠结。我承认后者可能更可取。谢谢 :-)
2021-04-02 20:30:03

要添加到出色的Andy E 答案中,常用的函数可能是:

Date.createFromMysql = function(mysql_string)
{ 
   var t, result = null;

   if( typeof mysql_string === 'string' )
   {
      t = mysql_string.split(/[- :]/);

      //when t[3], t[4] and t[5] are missing they defaults to zero
      result = new Date(t[0], t[1] - 1, t[2], t[3] || 0, t[4] || 0, t[5] || 0);          
   }

   return result;   
}

通过这种方式给定 MySQL 日期/时间,"YYYY-MM-DD HH:MM:SS"甚至是简短的形式(仅日期),"YYYY-MM-DD"您可以执行以下操作:

var d1 = Date.createFromMysql("2011-02-20");
var d2 = Date.createFromMysql("2011-02-20 17:16:00");
alert("d1 year = " + d1.getFullYear());
您应该使用new Date(Date.UTC(...))其他方式,最多 24 小时答案是错误的...
2021-04-06 20:30:03

我想我可能找到了一种更简单的方法,没有人提到过。

MySQL DATETIME 列可以通过以下方式转换为 unix 时间戳:

SELECT unix_timestamp(my_datetime_column) as stamp ...

我们可以通过使用自纪元以来需要毫秒的构造函数来创建一个新的 JavaScript Date 对象。unix_timestamp 函数返回自纪元以来的秒数,因此我们需要乘以 1000:

SELECT unix_timestamp(my_datetime_column) * 1000 as stamp ...

结果值可以直接用于实例化一个正确的 Javascript Date 对象:

var myDate = new Date(<?=$row['stamp']?>);

希望这可以帮助。

是的,高效简单的方法。但是,我会将unix时间戳的乘法(* 1000)推送到客户端(在javascript中)
2021-03-26 20:30:03

现代浏览器(IE10+)的一个班轮:

var d = new Date(Date.parse("2010-06-09 13:12:01"));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)

只是为了好玩,这里有一个可以跨旧浏览器工作的单行代码(现已修复):

new (Function.prototype.bind.apply(Date, [null].concat("2010-06-09 13:12:01".split(/[\s:-]/)).map(function(v,i){return i==2?--v:v}) ));
alert(d); // Wed Jun 09 2010 13:12:01 GMT+0100 (GMT Daylight Time)
优秀的答案.. 他们都有效,尤其是第一个
2021-03-14 20:30:03
@nickyspag 无赖!使用 map() 修复了它,但不再那么简洁了。
2021-03-29 20:30:03
第二个例子(“可以在旧浏览器上工作的单行”)给了我一个未来一个月的日期。我认为月份参数是零索引的。
2021-04-11 20:30:03

最新版本的 JavaScript 将读取 ISO8601 格式的日期,因此您只需将空格更改为“T”,执行以下操作之一:

#MySQL
select date_format(my_date_column,'%Y-%m-%dT%T') from my_table;

#PHP
$php_date_str = substr($mysql_date_str,0,10).'T'.substr($mysql_date_str,11,8);

//JavaScript
js_date_str = mysql_date_str.substr(0,10)+'T'+mysql_date_str.substr(11,8);