I'm trying to use JavaScript to convert a date object into a valid MySQL date - what is the best way to do this?
- 
                    1possible duplicate of [Convert JS date time to MySQL datetime](http://stackoverflow.com/questions/5129624/convert-js-date-time-to-mysql-datetime) – Gajus Dec 01 '13 at 12:01
14 Answers
To get the date:
const date = new Date().toJSON().slice(0, 10)
console.log(date) //2015-07-23For datetime:
const datetime = new Date().toJSON().slice(0, 19).replace('T', ' ')
console.log(datetime) //2015-07-23 11:26:00Note that the resulting date/datetime will always be in the UTC timezone.
 
    
    - 3,330
- 2
- 24
- 26
- 
                    2OP wants a MySQL DATE object, not a DATETIME, so you need "/T.*/" instead of "'T'". apart from that, wondering why this is not the most upvoted answer? – xShirase Sep 13 '14 at 17:15
- 
                    2
- 
                    1A slight variation on the same theme: ``(new Date()).toISOString().split(/[T\.]/).slice(0,2).join(' ')`` – Andrew Eddie Apr 19 '16 at 23:33
- 
                    5
- 
                    3When i did this (new Date(str_date)).toISOString().substring(0, 10) the date became day before the str_date. not accurate when parsing from string to date – Shift 'n Tab Nov 07 '17 at 23:41
- 
                    1@ShiftN'Tab yes, you need to be careful with that, because the result is in the UTC timezone – Afanasii Kurakin Nov 09 '17 at 04:34
- 
                    3@KubaHoluj I'll make sure to add a note about that in the comments for the poor sod reviewing my code in the year 10000 – serakfalcon Mar 12 '18 at 05:44
- 
                    1
- 
                    
Update: Here in 2021, Date.js hasn't been maintained in years and is not recommended, and Moment.js is in "maintenance only" mode. We have the built-in Intl.DateTimeFormat, Intl.RelativeTimeFormat, and (soon) Temporal instead, probably best to use those. Some useful links are linked from Moment's page on entering maintenance mode.
Old Answer:
Probably best to use a library like Date.js (although that hasn't been maintained in years) or Moment.js.
But to do it manually, you can use Date#getFullYear(), Date#getMonth() (it starts with 0 = January, so you probably want + 1), and Date#getDate() (day of month). Just pad out the month and day to two characters, e.g.:
(function() {
    Date.prototype.toYMD = Date_toYMD;
    function Date_toYMD() {
        var year, month, day;
        year = String(this.getFullYear());
        month = String(this.getMonth() + 1);
        if (month.length == 1) {
            month = "0" + month;
        }
        day = String(this.getDate());
        if (day.length == 1) {
            day = "0" + day;
        }
        return year + "-" + month + "-" + day;
    }
})();
Usage:
var dt = new Date();
var str = dt.toYMD();
Note that the function has a name, which is useful for debugging purposes, but because of the anonymous scoping function there's no pollution of the global namespace.
That uses local time; for UTC, just use the UTC versions (getUTCFullYear, etc.).
Caveat: I just threw that out, it's completely untested.
 
    
    - 1,031,962
- 187
- 1,923
- 1,875
- 
                    MomentJS also now "a legacy project" in their own words https://momentjs.com/docs/#/-project-status/ so best is actually to directly use `Date`. – Jim Driscoll Dec 28 '21 at 11:12
- 
                    
The shortest version of this answer by Chris Mayhew:
/**
 * MySQL date
 * @param {Date} [date] Optional date object
 * @returns {string}
 */
function mysqlDate(date = new Date()) {
  return date.toISOString().split('T')[0];
}
const date = mysqlDate();
console.log(date); 
    
    - 5,031
- 17
- 33
- 41
 
    
    - 407
- 8
- 14
Just edit the string instead:
const date = new Date();
const myDate = date.toISOString().replace("T", " ");
const myDateString = myDate.substring(0, myDate.length - 5);
console.log(myDateString); 
    
    - 5,031
- 17
- 33
- 41
 
    
    - 97
- 1
- 1
- 
                    4There are quite a few things wrong here. Do not redeclare `var`. Read about "hoisting". Furthermore, this is sufficient, `new Date().toISOString().slice(0, 10)`. – Gajus Dec 01 '13 at 12:00
- 
                    @Gajus for me `Date().toISOString().slice(0, 10)` was not sufficient fails with several dates - wrong by 1 day for 7th June 1979 for instance – Tin Bum Mar 10 '14 at 01:45
- 
                    1-1 when you use `toISOString()` you are converting the date from the timezone shown into UTC time. So for example if the web page you are looking at is on GMT-6 and showing a GMT-6 time and your browser is running on a computer that is GMT-5 then when you use `toISOString()` you will now have a UTC time that 5 hours off the webpage instead of 6 – gillyspy Jul 22 '14 at 15:47
function js2Sql(cDate) {
    return cDate.getFullYear()
         + '-'
         + ("0" + (cDate.getMonth() + 1)).slice(-2)
         + '-'
         + ("0" + cDate.getDate()).slice(-2);
}
const currentDate = new Date();
const sqlDate = js2Sql(currentDate);
console.log(sqlDate); 
    
    - 5,031
- 17
- 33
- 41
 
    
    - 71
- 1
- 1
To convert a JavaScript date to a MySQL one, you can do:
const currentDate = new Date();
const date = currentDate.toISOString().split("T")[0];
console.log(date); 
    
    - 5,031
- 17
- 33
- 41
 
    
    - 4,965
- 3
- 21
- 27
A bit of a typo in the first example, when a day has a length less than 1 it is adding the month instead of the day to the result.
Works great though if you change:
    if (day.length == 1) {
        day = "0" + month;
    }
to
    if (day.length == 1) {
        day = "0" + day;
    }
Thanks for posting that script.
The corrected function looks like:
Date.prototype.toYMD = Date_toYMD;
function Date_toYMD() {
    var year, month, day;
    year = String(this.getFullYear());
    month = String(this.getMonth() + 1);
    if (month.length == 1) {
        month = "0" + month;
    }
    day = String(this.getDate());
    if (day.length == 1) {
        day = "0" + day;
    }
    return year + "-" + month + "-" + day;
}
 
    
    - 1,237
- 3
- 16
- 26
Object.defineProperties(Date.prototype, {
  date: {
    get: function() {
      return this.toISOString().split('T')[0];
    }
  },
  time: {
    get: function() {
      return this.toTimeString().match(/\d{2}:\d{2}:\d{2}/)[0];
    }
  },
  datetime: {
    get: function() {
      return this.date + " " + this.time
    }
  }
});
const date = (new Date).datetime
console.log(date); 
    
    - 5,031
- 17
- 33
- 41
 
    
    - 4,642
- 1
- 32
- 21
I needed this for a filename and with the time in the current timezone.
const timezoneOffset = (new Date()).getTimezoneOffset() * 60000;
const date = (new Date(Date.now() - timezoneOffset))
    .toISOString()
    .substring(0, 19)
    .replace('T', '')       // replace T with a space
    .replace(/ /g, "_")     // replace spaces with an underscore
    .replace(/\:/g, ".");   // replace colons with a dot
Source
I'd like to say that this is likely the best way of going about it. Just confirmed that it works:
new Date().toISOString().replace('T', ' ').split('Z')[0];
 
    
    - 335
- 2
- 13
// function
getDate = function(dateObj){
    var day = dateObj.getDay() < 9 ? '0'+dateObj.getDay():dateObj.getDay();
    var month = dateObj.getMonth() < 9 ? '0'+dateObj.getMonth():dateObj.getMonth();
    return dateObj.getFullYear()+'-'+month+'-'+day;
}
// example usage
console.log(getDate(new Date()));
// with custom date
console.log(getDate(new Date(2012,dateObj.getMonth()-30,dateObj.getDay()));
 
    
    - 1,196
- 1
- 13
- 29
Take a look at this handy library for all your date formatting needs: http://blog.stevenlevithan.com/archives/date-time-format
 
    
    - 1,760
- 1
- 17
- 34
Try this
dateTimeToMYSQL(datx) {
    var d = new Date(datx),
      month = '' + (d.getMonth() + 1),
      day = d.getDate().toString(),
      year = d.getFullYear(),
      hours = d.getHours().toString(),
      minutes = d.getMinutes().toString(),
      secs = d.getSeconds().toString();
    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;
    if (hours.length < 2) hours = '0' + hours;
    if (minutes.length < 2) minutes = '0' + minutes;
    if (secs.length < 2) secs = '0' + secs;
    return [year, month, day].join('-') + ' ' + [hours, minutes, secs].join(':');
  }
Note that you can remove the hours, minutes and seconds and you will have the result as YYYY-MM-DD The advantage is that the datetime entered in the HTML form remains the same: no transformation into UTC
The result will be (for your example) :
dateToMYSQL(datx) {
    var d = new Date(datx),
      month = '' + (d.getMonth() + 1),
      day = d.getDate().toString(),
      year = d.getFullYear();
    if (month.length < 2) month = '0' + month;
    if (day.length < 2) day = '0' + day;
    return [year, month, day].join('-');
  }
 
    
    - 799
- 9
- 23
Can be!
function Date_toYMD(d)
{
    var year, month, day;
    year = String(d.getFullYear());
    month = String(d.getMonth() + 1);
    if (month.length == 1) {
        month = "0" + month;
    }
    day = String(d.getDate());
    if (day.length == 1) {
        day = "0" + day;
    }
    return year + "-" + month + "-" + day;
}
 
    
    - 15,855
- 14
- 59
- 80
 
     
     
    