将MySql DateTime戳转换为JavaScript的Date格式


160

有谁知道我可以如何使用MySQL datetime数据类型的值,例如YYYY-MM-DD HH:MM:SS进行解析或转换为可在JavaScript Date()函数中使用的值,例如:-Date('YYYY,MM,DD,HH,MM,SS);

谢谢!


然后,在完成所有这些操作之后,我发现Javascript日期没有添加日期的简便方法……
Kolob Canyon

Answers:


418

此处给出的某些答案过于复杂或无法正常使用(至少并非在所有浏览器中都如此)。如果您退后一步,您会发现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日期(这是默认日期,如果字符串中没有时区成分,建议使用该日期)。


3
非常感谢您提供的这种优雅的解决方案!我必须使用它,因为Safari似乎无法从MySQL时间戳字符串中自动生成Date对象。var d = new Date("2010-06-09 13:12:01");。有趣的是,Chrome没问题。
alnafie 2012年

并认为其他答案可以建议更复杂的解决方案。非常感谢!
RD 2014年

这是错误的答案。正确的答案由Symen Timmermans在下面发布。自1970年UTC以来,所有日期都被序列化(存储)为一个数字,该数字以秒(在Unix时间戳的情况下)或毫秒(javascript)为单位。操纵日期字符串,用复杂的数字表示该日期字符串会浪费资源。只需将unix时间戳(乘以1000毫秒)传递给javascript Date构造函数(如Symen Timmermans所建议),就可以了。
Reinsbrain 2014年

1
@Reinsbrain:这不是错误的答案,只是一个不符合您要求的答案。有区别。如果实现者无法访问执行MySQL查询的服务器代码(也许是某种Web服务)怎么办?如果因为在服务器上更改客户端代码将意味着更多工作而更容易编辑客户端代码,该怎么办?将头发分割成几个字节是没有意义的,这些字节可以通过gzip压缩而变得微不足道,或者说分割字符串所需的毫秒数为千分之一。
Andy E

4
嗯mysql使用一个时区,而javascript Date构造函数仅接受本地时区,因此最多24小时会导致此解决方案出现错误... new Date(Date.UTC(...))更好,但是假定mysql使用utc ...在此之前考虑可以被视为正确答案。
user3338098 2015年

64

为了增加出色的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());

3
您应该使用new Date(Date.UTC(...))其他明智的方法,直到24小时为止答案是错误的……
user3338098 2015年

30

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

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']?>);

希望这可以帮助。


4
是的,高效简便的方法。但是,我会将unix时间戳的乘法(* 1000)推送到客户端(使用javascript)
Reinsbrain 2014年

16

一种适用于现代浏览器(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)

1
第二个示例(“可以在较旧的浏览器上使用的单一代码”)为我提供了一个月后的日期。我认为月份参数是零索引的。
nickyspag 2015年

@nickyspag um!使用map()修复了它,但不再简洁。
2015年

出色答卷..他们都没有工作,尤其是第一
大卫Addoteye

7

最新版本的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);

3

进一步增加了Marco的解决方案。我直接原型化为String对象。

String.prototype.mysqlToDate = String.prototype.mysqlToDate || function() {
    var t = this.split(/[- :]/);
    return new Date(t[0], t[1]-1, t[2], t[3]||0, t[4]||0, t[5]||0);
};

这样,您可以直接转到:

var mySqlTimestamp = "2011-02-20 17:16:00";
var pickupDate = mySqlTimestamp.mysqlToDate();

3

有一种更简单的方法,sql时间戳字符串:

2018-07-19 00:00:00

以下是与Date()接收的时间戳最接近的格式,因此将“ T”替换为空白:

var dateString = media.intervention.replace(/\s/g, "T");

“ 2011-10-10T14:48:00”

然后,创建日期对象:

var date = new Date(dateString);

结果将是日期对象:

2018年7月19日星期四00:00:00 GMT-0300(巴西利亚霍拉里奥·帕德朗)


2

Andy的答案开始,对于AngularJS-过滤器

angular
    .module('utils', [])
.filter('mysqlToJS', function () {
            return function (mysqlStr) {
                var t, result = null;

                if (typeof mysqlStr === 'string') {
                    t = mysqlStr.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;
            };
        });

嗨,谢谢杰姆。这解决了我为ios构建的有角度的应用程序中的日期过长的问题。
mediaguru

1
var a=dateString.split(" ");
var b=a[0].split("-");
var c=a[1].split(":");
var date = new Date(b[0],(b[1]-1),b[2],b[0],c[1],c[2]);

+1(不引发正则表达式)。(现在,如果我们能将其变成一体式并摆脱
变种

1

首先,您可以为JavaScript的Date对象(类)提供新的方法'fromYMD()',该方法用于将MySQL的YMD日期格式转换为JavaScript格式,方法是将YMD格式拆分为多个组件并使用以下日期组件:

Date.prototype.fromYMD=function(ymd)
{
  var t=ymd.split(/[- :]/); //split into components
  return new Date(t[0],t[1]-1,t[2],t[3]||0,t[4]||0,t[5]||0);
};

现在,您可以定义自己的对象(JavaScript世界中的功能):

function DateFromYMD(ymd)
{
  return (new Date()).fromYMD(ymd);
}

现在您可以简单地从MySQL日期格式创建日期;

var d=new DateFromYMD('2016-07-24');

0

您可以使用unix时间戳来定向:

SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

然后将epoch_time放入JavaScript中,这很简单:

var myDate = new Date(epoch_time * 1000);

乘以1000是因为JavaScript需要毫秒,而UNIX_TIMESTAMP需要秒。


-3

在Google中快速搜索提供了以下内容:

 function mysqlTimeStampToDate(timestamp) {
    //function parses mysql datetime string and returns javascript Date object
    //input has to be in this format: 2007-06-05 15:26:02
    var regex=/^([0-9]{2,4})-([0-1][0-9])-([0-3][0-9]) (?:([0-2][0-9]):([0-5][0-9]):([0-5][0-9]))?$/;
    var parts=timestamp.replace(regex,"$1 $2 $3 $4 $5 $6").split(' ');
    return new Date(parts[0],parts[1]-1,parts[2],parts[3],parts[4],parts[5]);
  }

资料来源:http : //snippets.dzone.com/posts/show/4132


-4

为什么不这样做:

var d = new Date.parseDate( "2000-09-10 00:00:00", 'Y-m-d H:i:s' );

2
parseDate不是Date对象的JS方法。最终有一个静态的parse方法,但它仅接受1个参数。
Marco Demaio 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.