【问题标题】:Convert MySql DateTime stamp into JavaScript's Date format将 MySql 日期时间戳转换为 JavaScript 日期格式
【发布时间】:2011-03-05 18:30:51
【问题描述】:

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

谢谢!

【问题讨论】:

  • 然后在做了所有这些之后,我发现Javascript Dates没有一个简单的方法来添加日期......

标签: javascript jquery mysql datetime


【解决方案1】:

这里给出的一些答案要么过于复杂,要么根本不起作用(至少,不是在所有浏览器中)。如果您退后一步,您可以看到 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 对此没有任何问题。
  • 并认为其他答案提出了更复杂的解决方案。非常感谢!
  • @Reinsbrain:这不是错误的答案,只是不符合您的要求。有区别。如果实现者无法访问执行 MySQL 查询的服务器代码(可能是某种 Web 服务)怎么办?如果编辑客户端代码更容易因为在服务器上更改它意味着更多的工作怎么办?没有必要在几个字节上拆分头发,这些字节可能通过 gzip 压缩变得微不足道,或者拆分字符串所需的千分之一毫秒。
  • 呃 mysql 使用一个时区,而 javascript Date 构造函数只接受本地时区,因此该解决方案最多会出现 24 小时错误...new Date(Date.UTC(...)) 更好,但假设 mysql使用 utc...无论哪种方式,都需要考虑这一点,然后才能将其视为正确答案。
  • @Kolob:我已经更新了Date.UTC 推荐。我在作者是否想要 MySQL 或本地时区表示的日期之间纠结。我承认后者可能更可取。谢谢:-)
【解决方案2】:

为了给优秀的Andy E answer添加一个常用的函数可能是:

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;   
}

以这种方式给定"YYYY-MM-DD HH:MM:SS" 形式的 MySQL 日期/时间,甚至是简短形式(仅日期)"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小时......
【解决方案3】:

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

可以通过以下方式将 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 中)
【解决方案4】:

现代浏览器 (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)

【讨论】:

  • 第二个示例(“适用于旧版浏览器的单线”)给了我一个未来一个月的日期。我认为月份参数是零索引的。
  • @nickyspag 无赖!使用 map() 修复了它,但不再那么简洁了。
  • 优秀的答案.. 他们都工作了,尤其是第一个
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    进一步添加到 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();
    

    【讨论】:

      【解决方案7】:

      还有一个更简单的方法,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(Horário Padrão de Brasília)

      【讨论】:

        【解决方案8】:

        来自Andy's Answer, 对于 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 构建的 Angular 应用程序中的错误日期。
        【解决方案9】:
        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 表示不调用正则表达式。 (现在,如果我们可以把它变成一个单行器并去掉变量......)
        【解决方案10】:

        首先,您可以为 JavaScript 的 Date 对象(类)提供新方法 'fromYMD()',通过将 YMD 格式拆分为组件并使用这些日期组件,将 MySQL 的 YMD 日期格式转换为 JavaScript 格式:

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

        【讨论】:

          【解决方案11】:

          在将字符串日期提供给 Date 对象之前,您可以使用 Js Date() 方法构造这样的布局:

           parseDate(date){
                   const formated = new Date(date)
                   
                   return `${formated.getFullYear()}/${formated.getMonth()}/${formated.getDay()}`;
               },
          

          【讨论】:

          • 欢迎来到 StackOverflow。虽然此代码可能会回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将提高​​答案的长期价值。
          • 这个答案应该是正确的,简短而高效
          【解决方案12】:

          如何在 Javascript 中操作 MySQL 时间戳

          我今天不得不处理这个话题

          所以我混合了两个我想分享的功能

          function mysqlDatetoJs(mysqlTimeStamp){
              var t = mysqlTimeStamp.split(/[- :]/);
                  return new Date(t[0], t[1]-1, t[2], t[3], t[4], t[5]);
              }
          

          然后

          function prettyDate(date) {
              var months =  ['Gen', 'Feb', 'Mar', 'Apr', 'Mag', 'Giu',
                              'Lug', 'Ago', 'Set', 'Ott', 'Nov', 'Dic'];
          
              return date.getUTCDate() + ' ' + months[date.getUTCMonth()] 
              + ' ' + date.getUTCFullYear();
              }
          

          我用它来构建这样的动态表

          td.innerHTML = prettyDate(mysqlDatetoJs(array[i].data));
          

          在 TD 中打印日期

          4 Set 2021
          

          鉴于 array[i].data 是 MySQL 表中的日期记录,特别是对于这个回复,它的格式为

          2021-09-04 11:25:20
          

          希望对你有用

          虽然我在此页面中找到了干净的 date() 解释 https://www.digitalocean.com/community/tutorials/understanding-date-and-time-in-javascript

          【讨论】:

            【解决方案13】:

            你可以使用unix时间戳来指导:

            SELECT UNIX_TIMESTAMP(date) AS epoch_time FROM table;

            然后将 epoch_time 导入到 JavaScript 中,就很简单了:

            var myDate = new Date(epoch_time * 1000);

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

            【讨论】:

              【解决方案14】:

              在谷歌快速搜索提供了这个:

               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

              【讨论】:

                【解决方案15】:

                为什么不这样做:

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

                【讨论】:

                • parseDate 不是 Date 对象的 JS 方法。最终有一个静态解析方法,但它只接受 1 个参数。
                猜你喜欢
                • 1970-01-01
                • 2016-11-26
                • 2023-03-26
                • 1970-01-01
                • 2019-02-25
                • 1970-01-01
                • 2015-03-23
                • 1970-01-01
                相关资源
                最近更新 更多