Перетворити штамп MySql DateTime у формат дати JavaScript


160

Хто-небудь знає, як я можу прийняти datetimeзначення типу даних MySQL , наприклад, YYYY-MM-DD HH:MM:SSабо проаналізувати його або перетворити його на роботу у Date()функції JavaScript , наприклад: - Дата ("РРРР, ММ, DD, HH, MM, SS);

Дякую!


Потім, зробивши все це, я виявив, що в датах Javascript немає простого способу додавання дат ...
Колоб Каньйон

Відповіді:


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 не може автоматично генерувати об'єкт Date з рядка часової позначки MySQL, наприклад. var d = new Date("2010-06-09 13:12:01");. Хоча що цікаво, у Chrome немає проблем з цим.
alnafie

і думати, що інші відповіді там, де пропонується більш складне рішення. Дуже дякую!
РД

Це неправильна відповідь. Правильна відповідь розміщена нижче Symen Timmermans. Усі дати серіалізуються (зберігаються) у вигляді числа, яке відлічує або секунду (у випадку часової позначки Unix), або мілісекунд (javascript) з 1970 року UTC. Маніпулювання рядками дат, які є суперечливим поданням цього числа, є марною витратою ресурсів. Просто передайте UNIX часову марку (помножену на 1000 за мілісекунди) конструктору дати JavaScript (як запропонував Symen Timmermans) і у вас є.
Рейнсбрайн

1
@Reinsbrain: Це неправильна відповідь, лише той, який не відповідав вашим вимогам. Є різниця. Що робити, якщо реалізатор не має доступу до коду сервера, який виконує запит MySQL (можливо, якийсь веб-сервіс)? Що робити, якщо простіше редагувати код клієнтської сторони, оскільки зміна його на сервері означатиме більше роботи? Немає сенсу розщеплювати волоски на кілька байтів, які можна зробити незначними за допомогою gzipping, або десятитисячних частки мілісекунди, необхідних для розділення струни.
Енді Е

4
uh mysql використовує один часовий пояс, а конструктор дат JavaScript відповідає лише місцевому часовому поясу, таким чином, це рішення new Date(Date.UTC(...))стає неправильним протягом 24 годин ... тим краще, але це передбачає, що mysql використовує utc ... в будь-якому випадку це потрібно розглянутий до цього можна вважати правильною відповіддю.
користувач3338098

64

Щоб додати до чудової відповіді Енді Е, функцією загального використання може бути:

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 годин ...
користувач3338098

30

Я думаю, що я, можливо, знайшов простіший спосіб, про який ніхто не згадував.

Стовпець DATETIME MySQL може бути перетворений в часову позначку unix через:

SELECT unix_timestamp(my_datetime_column) as stamp ...

Ми можемо створити новий об’єкт дати JavaScript, використовуючи конструктор, який потребує мілісекунд з епохи. Функція unix_timestamp повертає секунди з епохи, тому нам потрібно помножити на 1000:

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

Отримане значення може бути використане безпосередньо для створення правильного об'єкта Javascript Date:

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

Сподіваюся, це допомагає.


4
Так, ефективний простий спосіб. Але я б натиснув множення (* 1000) часової позначки unix на клієнта (у javascript)
Reinsbrain

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

@nickyspag бампер! виправлено це за допомогою map (), але вже не як стислого.
aleemb

ВИКЛЮЧНА відповідь .. всі вони спрацювали, особливо перший
Девід Аддотей

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

Щоб ще більше додати рішення Марко. Я прототипував безпосередньо об'єкт 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);

Результатом буде об’єкт дати:

Чт 19 липня 2018 00:00:00 GMT-0300 (Horário Padrão de Brasília)


2

З відповіді Енді , для 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;
            };
        });

Привіт і спасибі jaym. Це вирішило зламану дату в кутовому додатку, який я створив для 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

Спочатку ви можете надати об’єкту Date (класу) JavaScript новий метод "fromYMD ()" для перетворення формату дати YMD MySQL у формат 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);
};

Тепер ви можете визначити власний об’єкт (funcion у світі 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 не є методом JS об'єкта Date. Врешті-решт існує метод статичного розбору, але він приймає лише 1 аргумент.
Марко Демайо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.