Конвертируйте марку MySql DateTime в формат даты JavaScript

160

Кто-нибудь знает, как я могу принять datetimeзначение типа данных MySQL , например, YYYY-MM-DD HH:MM:SSи либо проанализировать его, либо преобразовать его для работы в Date()функции JavaScript , например: - Дата ('ГГГГ, ММ, ДД, ЧЧ, ММ, СС);

Спасибо!

DZM
источник
Затем, выполнив все это, я обнаружил, что в датах 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
и думать, что другие ответы, где предлагают более сложное решение. Большое спасибо!
RD
Это неправильный ответ. Правильный ответ опубликован ниже Симен Тиммерманс. Все даты сериализуются (сохраняются) как число, которое отсчитывает секунды (в случае метки времени Unix) или миллисекунды (javascript) с 1970 UTC. Манипулирование строками дат, которые являются запутанными представлениями этого числа, является пустой тратой ресурсов. Просто передайте метку времени Unix (умноженную на 1000 за миллисекунды) в конструктор даты javascript (как предложено Сименом Тиммермансом), и вы получите ее.
Reinsbrain
1
@ Reinsbrain: Это не неправильный ответ, просто тот, который не соответствует вашим требованиям. Есть разница Что если разработчик не имеет доступа к коду сервера, выполняющему запрос MySQL (возможно, какой-то веб-сервис)? Что, если легче отредактировать код на стороне клиента, потому что изменение его на сервере будет означать больше работы? Нет смысла расщеплять волоски на несколько байтов, которые можно сделать незначительными при помощи gzipping или десяти тысячных миллисекунды, необходимых для расщепления строки.
Энди Э,
4
эээ mysql использует один часовой пояс, а конструктор javascript Date принимает только локальный часовой пояс, что делает это решение неправильным до 24 часов ... new Date(Date.UTC(...))это лучше, но это предполагает, что mysql использует utc ... в любом случае это должно быть считается, что до этого можно считать правильным ответом.
user3338098
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
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 ...

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

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)
aleemb
источник
1
Второй пример («одна строка, которая будет работать в старых браузерах») дает мне дату один месяц в будущем. Я думаю, что параметр месяца нулевой индексации.
nickyspag
@ nickyspag облом! исправил это с помощью map (), но уже не так кратко.
aleemb
ОТЛИЧНЫЙ ответ .. все они работали, особенно первый
Дэвид Аддотей
7

В последних версиях JavaScript будет считываться дата в формате ISO8601, поэтому все, что вам нужно сделать, это изменить пространство на «Т», выполнив что-то вроде одного из следующих:

#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.
Медиагуру
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]);
bhowden
источник
+1 за не вызывать регулярные выражения. (Теперь, если бы мы могли просто превратить его в единый и избавиться от перемен ...)
T4NK3R
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);
};

Теперь вы можете определить свой собственный объект (функция в мире JavaScript):

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

и теперь вы можете просто создать дату из формата даты MySQL;

var d=new DateFromYMD('2016-07-24');
sbrbot
источник
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' );
josh803316
источник
2
parseDate не является методом JS объекта Date. В конце концов есть метод статического разбора, но он принимает только 1 аргумент.
Марко Демайо