MySql DateTime 스탬프를 JavaScript의 날짜 형식으로 변환


160

누구든지 MySQL datetime데이터 유형 값을 가져 와서 YYYY-MM-DD HH:MM:SS구문 분석하거나 JavaScript Date()함수 에서 작동하도록 변환 하는 방법을 알고 있습니까? -Date ( 'YYYY, MM, DD, HH, MM, SS);

감사합니다!


그런 다음이 모든 작업을 수행 한 후 Javascript Dates에 날짜를 쉽게 추가 할 수있는 방법이 없다는 것을 알게되었습니다.
Kolob Canyon

답변:


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

더 복잡한 솔루션을 제안하는 다른 답변에 대해 생각합니다. 고마워요!
RD

이것은 잘못된 대답입니다. 정답은 아래 Symen Timmermans에 의해 게시됩니다. 모든 날짜는 1970 UTC 이후 초 (unix 타임 스탬프의 경우) 또는 밀리 초 (자바 스크립트)로 계산되는 숫자로 직렬화 (저장)됩니다. 이 숫자를 복잡하게 표현한 날짜 문자열을 조작하는 것은 자원 낭비입니다. 유닉스 타임 스탬프 (밀리 초에 1000을 곱한 값)를 javascript Date 생성자 (Symen Timmermans가 제안한)에 전달하면됩니다.
Reinsbrain

1
@ Reinsbrain : 그것은 틀린 대답이 아니라 요구 사항에 맞지 않는 대답입니다. 차이가 있습니다. 구현자가 MySQL 쿼리 (아마도 어떤 종류의 웹 서비스)를 수행하는 서버 코드에 액세스 할 수 없으면 어떻게됩니까? 서버에서 클라이언트 측 코드를 변경하면 더 많은 작업이 필요하므로 클라이언트 측 코드를 편집하기가 더 쉬운 경우 어떻게해야합니까? gzipping 또는 문자열을 분할하는 데 필요한 천분의 일의 밀리 초로 인해 몇 바이트에 걸쳐 머리카락을 분할하는 점은 없습니다.
Andy E

4
uh 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 컬럼은 다음을 통해 유닉스 타임 스탬프로 변환 될 수 있습니다.

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
예, 효율적이고 쉬운 방법입니다. 그러나 유닉스 타임 스탬프의 곱셈 (* 1000)을 클라이언트 (자바 스크립트)로
넘길 것입니다

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
두 번째 예 ( "이전 브라우저에서 작동하는 한 줄짜리")는 한 달 후에 날짜를 알려줍니다. 월 매개 변수는 0으로 색인되어 있다고 생각합니다.
nickyspag

트윗 담아 가기 더 이상 간결하지 않은 map ()을 사용하여 수정했습니다.
aleemb

우수 답변 .. 그들은 모두 특히, 처음 일했다
David 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);

결과는 날짜 객체입니다.

목 7 월 19 2018 00:00:00 GMT-0300 (호라 리오 파드 라오 데 브라질리아)


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입니다. (지금, 만약 우리가 그것을 하나의 라이너로 바꾸고 변수를 제거 할 수 있다면 ...)
T4NK3R

1

먼저, YMD 형식을 컴포넌트로 분할하고 다음 날짜 컴포넌트를 사용하여 MySQL의 YMD 날짜 형식을 JavaScript 형식으로 변환하기위한 JavaScript의 Date 오브젝트 (클래스)에 새로운 메소드 'fromYMD ()'를 제공 할 수 있습니다.

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

유닉스 타임 스탬프를 사용하여 다음을 지시 할 수 있습니다.

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 메서드가 아닙니다. 결국 정적 구문 분석 방법이 있지만 1 개의 인수 만 허용합니다.
Marco Demaio
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.