Ubah waktu tanggal JS menjadi waktu waktu MySQL

124

Apakah ada yang tahu bagaimana mengubah tanggal JS ke datetime MySQL? Juga apakah ada cara untuk menambahkan jumlah menit tertentu ke JS datetime dan kemudian meneruskannya ke MySQL datetime?

lokomotif
sumber

Jawaban:

89

Meskipun JS memiliki alat dasar yang cukup untuk melakukan ini, JS cukup kikuk.

/**
 * You first need to create a formatting function to pad numbers to two digits…
 **/
function twoDigits(d) {
    if(0 <= d && d < 10) return "0" + d.toString();
    if(-10 < d && d < 0) return "-0" + (-1*d).toString();
    return d.toString();
}

/**
 * …and then create the method to output the date string as desired.
 * Some people hate using prototypes this way, but if you are going
 * to apply this to more than one Date object, having it as a prototype
 * makes sense.
 **/
Date.prototype.toMysqlFormat = function() {
    return this.getUTCFullYear() + "-" + twoDigits(1 + this.getUTCMonth()) + "-" + twoDigits(this.getUTCDate()) + " " + twoDigits(this.getUTCHours()) + ":" + twoDigits(this.getUTCMinutes()) + ":" + twoDigits(this.getUTCSeconds());
};
kojiro
sumber
Bagaimana Anda memanggil fungsi seperti ini dengan variabel?
Catfish
1
@Catfish Maksud Anda dengan tanggal tertentu? Anda menggunakan Dateobjek. new Date().toMysqlFormat()atau new Date(2014,12,14).toMysqlFormat()atau apapun.
kojiro
17
Jawaban ini memiliki masanya sementara JavaScript sudah tua dan kikuk. Jika Anda menargetkan browser modern, saya merekomendasikan pendekatan GajustoISOString .
kojiro
320
var date;
date = new Date();
date = date.getUTCFullYear() + '-' +
    ('00' + (date.getUTCMonth()+1)).slice(-2) + '-' +
    ('00' + date.getUTCDate()).slice(-2) + ' ' + 
    ('00' + date.getUTCHours()).slice(-2) + ':' + 
    ('00' + date.getUTCMinutes()).slice(-2) + ':' + 
    ('00' + date.getUTCSeconds()).slice(-2);
console.log(date);

atau bahkan lebih pendek:

new Date().toISOString().slice(0, 19).replace('T', ' ');

Keluaran:

2012-06-22 05:40:06

Untuk kasus penggunaan yang lebih lanjut, termasuk mengontrol zona waktu, pertimbangkan untuk menggunakan http://momentjs.com/ :

require('moment')().format('YYYY-MM-DD HH:mm:ss');

Untuk alternatif yang ringan , pertimbangkan https://github.com/taylorhakes/fecha

require('fecha').format('YYYY-MM-DD HH:mm:ss')
Gajus
sumber
Anda memiliki kurung buka tambahan sebelum date.getUTCDate, dan ya ini lebih baik.
Adam Lockhart
28
ini akan memberikan masalah karena zona waktu
Mr Coder
3
Ini membuang pengaturan zona waktu, bagaimana cara menyimpannya?
shapeare
2
gabungkan
3
Solusi lengkap dengan oneliner zona waktu !! var d = new Date(); d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
Paulo Roberto Rosa
78

Saya pikir solusinya bisa kurang kikuk dengan menggunakan metode toISOString(), ia memiliki kompatibilitas browser yang luas.

Jadi ekspresi Anda akan menjadi satu baris:

new Date().toISOString().slice(0, 19).replace('T', ' ');

Output yang dihasilkan:

"2017-06-29 17:54:04"

Sisi jauh
sumber
2
Bekerja dengan sangat baik! new Date(1091040026000).toISOString().slice(0, 19).replace('T', ' ');
Yohanes
6
Besar, hanya satu masalah di sini: metode yang lebih kikuk akan mendapatkan jam, hari, bulan (bahkan tahun) setelah penerapan js Date's offset zona waktu . Sedangkan milik Anda mengembalikan waktu UTC yang mendasari dalam format MySQL DATETIME. Dalam kebanyakan kasus, menyimpan UTC mungkin lebih baik, dan dalam kedua kasus tabel data Anda mungkin harus memberikan info lokasi dalam satu bidang. Alternatifnya, untuk mengubah ke waktu lokal cukup mudah: gunakan ... - Date.getTimezoneOffset() * 60 * 1000(NB juga menyesuaikan untuk Waktu Musim Panas jika berlaku).
mike rodent
14

Nilai waktu JS untuk MySQL

var datetime = new Date().toLocaleString();

ATAU

const DATE_FORMATER = require( 'dateformat' );
var datetime = DATE_FORMATER( new Date(), "yyyy-mm-dd HH:MM:ss" );

ATAU

const MOMENT= require( 'moment' );
let datetime = MOMENT().format( 'YYYY-MM-DD  HH:mm:ss.000' );

Anda dapat mengirim ini di params ini akan berhasil.

M. Hamza Rajput
sumber
11

Untuk string tanggal arbitrer,

// Your default date object  
var starttime = new Date();
// Get the iso time (GMT 0 == UTC 0)
var isotime = new Date((new Date(starttime)).toISOString() );
// getTime() is the unix time value, in milliseconds.
// getTimezoneOffset() is UTC time and local time in minutes.
// 60000 = 60*1000 converts getTimezoneOffset() from minutes to milliseconds. 
var fixedtime = new Date(isotime.getTime()-(starttime.getTimezoneOffset()*60000));
// toISOString() is always 24 characters long: YYYY-MM-DDTHH:mm:ss.sssZ.
// .slice(0, 19) removes the last 5 chars, ".sssZ",which is (UTC offset).
// .replace('T', ' ') removes the pad between the date and time.
var formatedMysqlString = fixedtime.toISOString().slice(0, 19).replace('T', ' ');
console.log( formatedMysqlString );

Atau solusi satu baris,

var formatedMysqlString = (new Date ((new Date((new Date(new Date())).toISOString() )).getTime() - ((new Date()).getTimezoneOffset()*60000))).toISOString().slice(0, 19).replace('T', ' ');
console.log( formatedMysqlString );

Solusi ini juga berfungsi untuk Node.js saat menggunakan Timestamp di mysql.

Jawaban pertama @Gajus Kuizinas tampaknya memodifikasi prototipe toISOString mozilla

Paul Totzke
sumber
4

Pustaka DateJS yang terhormat memiliki rutinitas pemformatan (itu menggantikan ".toString ()"). Anda juga dapat melakukannya sendiri dengan mudah karena metode "Tanggal" memberikan semua nomor yang Anda butuhkan.

Runcing
sumber
4

Solusi lengkap (untuk mempertahankan zona waktu) menggunakan konsep jawaban @Gajus:

var d = new Date(),
    finalDate = d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
console.log(finalDate); //2018-09-28 16:19:34 --example output
Paulo Roberto Rosa
sumber
4

Tanggal baru (). toISOString (). slice (0, 10) + "" + Tanggal baru (). toLocaleTimeString ('en-GB');

100% bekerja

Nirbhay Kumar
sumber
0

Saya telah memberikan contoh format tanggal JavaScript sederhana, silakan periksa kode di bawah ini

var data = new Date($.now()); // without jquery remove this $.now()
console.log(data)// Thu Jun 23 2016 15:48:24 GMT+0530 (IST)

var d = new Date,
    dformat = [d.getFullYear() ,d.getMonth()+1,
               d.getDate()
               ].join('-')+' '+
              [d.getHours(),
               d.getMinutes(),
               d.getSeconds()].join(':');

console.log(dformat) //2016-6-23 15:54:16

Menggunakan momentjs

var date = moment().format('YYYY-MM-DD H:mm:ss');

console.log(date) // 2016-06-23 15:59:08

Contoh silahkan cek https://jsfiddle.net/sjy3vjwm/2/

Raja Rama Mohan Thavalam
sumber
Saya baru saja mencoba kode pertama Anda dengan vanilla javascript dan hasilnya seperti ini: 2018-4-20 15:11:23. Anda tidak mengisi angka dengan awalan "0". Juga, saya tidak tahu tentang momentjs tetapi tidakkah Anda harus meletakkan "HH" selama berjam-jam sehingga itu sesuai? Mungkin itu sebabnya Anda turun memilih? (itwasntme)
Alex
0

Cara termudah yang benar untuk mengonversi JS Date ke format SQL datetime yang terjadi pada saya adalah yang ini. Ini menangani offset zona waktu dengan benar.

const toSqlDatetime = (inputDate) => {
    const date = new Date(inputDate)
    const dateWithOffest = new Date(date.getTime() - (date.getTimezoneOffset() * 60000))
    return dateWithOffest
        .toISOString()
        .slice(0, 19)
        .replace('T', ' ')
}

toSqlDatetime(new Date()) // 2019-08-07 11:58:57
toSqlDatetime(new Date('2016-6-23 1:54:16')) // 2016-06-23 01:54:16

Berhati-hatilah karena jawaban @Paulo Roberto akan memberikan hasil yang salah pada saat pergantian hari (saya tidak bisa meninggalkan komentar). Contoh :

var d = new Date('2016-6-23 1:54:16'),
    finalDate = d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
console.log(finalDate); // 2016-06-22 01:54:16 

Kami punya 22 Juni, bukan 23!

Vlad Harbarchuk
sumber
0
var _t = new Date();

jika Anda ingin format UTC sederhana

_t.toLocaleString('indian', { timeZone: 'UTC' }).replace(/(\w+)\/(\w+)\/(\w+), (\w+)/, '$3-$2-$1 $4');

atau

_t.toISOString().slice(0, 19).replace('T', ' ');

dan jika ingin di zona waktu tertentu

_t.toLocaleString('indian', { timeZone: 'asia/kolkata' }).replace(/(\w+)\/(\w+)\/(\w+), (\w+)/, '$3-$2-$1 $4');
Suraj Inamdar
sumber
0

Saya menggunakan waktu yang lama ini dan ini sangat membantu saya, gunakan sesuka Anda

Date.prototype.date=function() {
    return this.getFullYear()+'-'+String(this.getMonth()+1).padStart(2, '0')+'-'+String(this.getDate()).padStart(2, '0')
}

Date.prototype.time=function() {
    return String(this.getHours()).padStart(2, '0')+':'+String(this.getMinutes()).padStart(2, '0')+':'+String(this.getSeconds()).padStart(2, '0')
}

Date.prototype.dateTime=function() {
    return this.getFullYear()+'-'+String(this.getMonth()+1).padStart(2, '0')+'-'+String(this.getDate()).padStart(2, '0')+' '+String(this.getHours()).padStart(2, '0')+':'+String(this.getMinutes()).padStart(2, '0')+':'+String(this.getSeconds()).padStart(2, '0')
}

Date.prototype.addTime=function(time) {
    var time=time.split(":")
    var rd=new Date(this.setHours(this.getHours()+parseInt(time[0])))
    rd=new Date(rd.setMinutes(rd.getMinutes()+parseInt(time[1])))
    return new Date(rd.setSeconds(rd.getSeconds()+parseInt(time[2])))
}

Date.prototype.addDate=function(time) {
    var time=time.split("-")
    var rd=new Date(this.setFullYear(this.getFullYear()+parseInt(time[0])))
    rd=new Date(rd.setMonth(rd.getMonth()+parseInt(time[1])))
    return new Date(rd.setDate(rd.getDate()+parseInt(time[2])))
}

Date.prototype.subDate=function(time) {
    var time=time.split("-")
    var rd=new Date(this.setFullYear(this.getFullYear()-parseInt(time[0])))
    rd=new Date(rd.setMonth(rd.getMonth()-parseInt(time[1])))
    return new Date(rd.setDate(rd.getDate()-parseInt(time[2])))
}

dan kemudian:

new Date().date()

yang mengembalikan tanggal sekarang dalam 'format MySQL'

untuk menambah waktu adalah

new Date().addTime('0:30:0')

yang akan menambah 30 menit .... dan seterusnya

Thomas
sumber