แปลง MySql DateTime เป็นรูปแบบวันที่ของ JavaScript


160

ไม่มีใครรู้ว่าฉันสามารถใช้datetimeค่าชนิดข้อมูลMySQL เช่นYYYY-MM-DD HH:MM:SSและแยกวิเคราะห์หรือแปลงให้ทำงานในDate()ฟังก์ชั่นของจาวาสคริปต์เช่น: - วันที่ ('YYYY, MM, DD, HH, MM, SS);

ขอบคุณ!


จากนั้นหลังจากทำสิ่งนี้ทั้งหมดฉันพบว่าวันที่ Javascript ไม่มีวิธีที่ง่ายในการเพิ่มวันที่ ...
Kolob Canyon

คำตอบ:


418

คำตอบบางส่วนที่ให้ไว้ที่นี่เป็นคำที่ซับซ้อนเกินไปหรืออาจใช้ไม่ได้ (อย่างน้อยไม่ใช่ในเบราว์เซอร์ทั้งหมด) หากคุณย้อนกลับไปคุณจะเห็นว่า MySQL timestamp มีองค์ประกอบของเวลาในลำดับเดียวกับอาร์กิวเมนต์ที่ต้องการโดยDate()Constructor

สิ่งที่ต้องการคือการแบ่งสตริงที่ง่ายมาก:

// 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

นี่คือคำตอบที่ผิด คำตอบที่ถูกต้องถูกโพสต์ด้านล่างโดย Symen Timmermans วันที่ทั้งหมดจะถูกทำให้เป็นอนุกรม (เก็บไว้) เป็นตัวเลขที่นับว่าเป็นวินาที (ในกรณีของการประทับเวลายูนิกซ์) หรือมิลลิวินาที (javascript) ตั้งแต่ 1970 UTC การจัดการสตริงวันที่ซึ่งเป็นตัวแทนที่ซับซ้อนของตัวเลขนี้เป็นการสิ้นเปลืองทรัพยากร เพียงผ่านการประทับเวลา unix (คูณด้วย 1,000 เป็นมิลลิวินาที) ไปยังตัวสร้าง Date ของ javascript (ตามที่ Symen Timmermans แนะนำ) และคุณมี
Reinsbrain

1
@ Reinsbrain: มันไม่ใช่คำตอบที่ผิดเพียงอันเดียวที่ไม่เหมาะกับความต้องการของคุณ มีความแตกต่าง จะเกิดอะไรขึ้นถ้าผู้ใช้งานไม่สามารถเข้าถึงรหัสเซิร์ฟเวอร์ที่ใช้การสืบค้น MySQL (อาจเป็นบริการบนเว็บบางประเภท) ถ้าแก้ไขรหัสด้านไคลเอนต์ได้ง่ายขึ้นเพราะการเปลี่ยนที่เซิร์ฟเวอร์จะทำให้ใช้งานได้มากกว่า ไม่มีจุดที่แยกผมมากกว่าสองสามไบต์ที่สามารถแสดงผลไม่สำคัญโดย gzipping หรือหนึ่งในพันของมิลลิวินาทีที่จำเป็นในการแยกสตริง
Andy E

4
uh mysql ใช้เขตเวลาเดียวและตัวสร้าง Date ของ javascript ยอมรับเฉพาะเขตเวลาท้องถิ่นเท่านั้นซึ่งทำให้การแก้ปัญหานี้ไม่ถูกต้องภายใน 24 ชั่วโมง ... new Date(Date.UTC(...))ดีกว่า แต่สมมติว่า mysql ใช้ utc ... วิธีนี้ต้องเป็น การพิจารณาก่อนหน้านี้ถือได้ว่าเป็นคำตอบที่ถูกต้อง
user3338098

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 ชั่วโมง ...
user3338098

30

ฉันคิดว่าฉันอาจพบวิธีที่ง่ายกว่านี้ไม่มีใครพูดถึง

คอลัมน์ MySQL DATETIME สามารถแปลงเป็นเวลา unix ผ่าน:

SELECT unix_timestamp(my_datetime_column) as stamp ...

เราสามารถสร้างออบเจ็กต์วันที่ JavaScript ใหม่โดยใช้ตัวสร้างที่ต้องใช้มิลลิวินาทีนับตั้งแต่ยุค ฟังก์ชัน unix_timestamp ส่งคืนวินาทีตั้งแต่ยุคดังนั้นเราจึงต้องคูณด้วย 1,000:

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

ค่าผลลัพธ์สามารถใช้โดยตรงเพื่อสร้างอินสแตนซ์ของวัตถุวันที่ของ Javascript ที่ถูกต้อง:

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

หวังว่านี่จะช่วยได้


4
ใช่วิธีง่าย ๆ ที่มีประสิทธิภาพ แต่ผมจะผลักดันการคูณ (* 1000) ของการประทับเวลายูนิกซ์สู่ลูกค้า (ใน 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 คนเกียจคร้าน! แก้ไขโดยใช้แผนที่ () แต่ไม่รวบรัดอีกต่อไป
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

เพื่อเพิ่มโซลูชันของมาร์โคให้ดียิ่งขึ้นไปอีก ฉันสร้างต้นแบบโดยตรงไปยังวัตถุ 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árioPadrão de Brasília)


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

สวัสดีและขอบคุณ 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 สำหรับการไม่เรียกใช้นิพจน์ทั่วไป (ตอนนี้ถ้าเราสามารถทำให้มันกลายเป็น oneliner และกำจัด vars ... )
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);
};

ตอนนี้คุณสามารถกำหนดวัตถุของคุณเอง (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);

การคูณด้วย 1,000 เป็นเพราะ 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 ข้อโต้แย้ง
Marco Demaio
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.