Chuyển đổi thời gian ngày của JS thành datetime của MySQL


124

Có ai biết làm thế nào để chuyển đổi ngày tháng của JS thành datetime của MySQL không? Ngoài ra có cách nào để thêm một số phút cụ thể vào datetime của JS và sau đó chuyển nó sang datetime của MySQL không?

Câu trả lời:


89

Mặc dù JS có đủ các công cụ cơ bản để làm việc này, nhưng nó khá là rắc rối.

/**
 * 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());
};

Làm thế nào để bạn gọi một chức năng như thế này với một biến?
Cá trê

1
@Catfish Bạn có nghĩa là với một ngày cụ thể? Bạn sử dụng một Dateđối tượng. new Date().toMysqlFormat()hoặc new Date(2014,12,14).toMysqlFormat()bất cứ điều gì.
kojiro

17
Câu trả lời này đã có ngày của nó trong khi JavaScript đã cũ và cồng kềnh. Nếu bạn nhắm mục tiêu một trình duyệt hiện đại, tôi khuyên bạn nên sử dụng toISOStringphương pháp của Gajus .
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);

hoặc thậm chí ngắn hơn:

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

Đầu ra:

2012-06-22 05:40:06

Đối với các trường hợp sử dụng nâng cao hơn, bao gồm kiểm soát múi giờ, hãy xem xét sử dụng http://momentjs.com/ :

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

Đối với một thay thế nhẹ cho , hãy xem xét https://github.com/taylorhakes/fecha

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

Bạn có một dấu ngoặc đơn mở thêm trước ngày.getUTCDate, và vâng điều này tốt hơn.
Adam Lockhart

28
điều này sẽ gây ra vấn đề do múi giờ
Mr Coder

3
Nó vứt bỏ cài đặt múi giờ, làm thế nào để giữ nó?
shapeare

2
kết hợp với điều này để chăm sóc múi giờ: stackoverflow.com/questions/11887934/
Khăn

3
Giải pháp đầy đủ với oneliner múi giờ !! var d = new Date(); d.toISOString().split('T')[0]+' '+d.toTimeString().split(' ')[0];
Paulo Roberto Rosa

78

Tôi nghĩ rằng giải pháp có thể ít cồng kềnh hơn bằng cách sử dụng phương pháp toISOString(), nó có khả năng tương thích trình duyệt rộng.

Vì vậy, biểu hiện của bạn sẽ là một lót:

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

Đầu ra được tạo:

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


2
Hoạt động rực rỡ! new Date(1091040026000).toISOString().slice(0, 19).replace('T', ' ');
Giăng

6
Tuyệt vời, chỉ có một vấn đề ở đây: các phương pháp vụng về hơn sẽ được nhận các giờ, ngày, tháng (thậm chí năm) sau khi áp dụng các js Date's múi giờ bù đắp . Trong khi đó của bạn trả về thời gian UTC cơ bản ở định dạng MySQL DATETIME. Trong hầu hết các trường hợp, việc lưu trữ UTC có thể tốt hơn và trong cả hai trường hợp, bảng dữ liệu của bạn có thể sẽ cung cấp thông tin vị trí trong một trường. Ngoài ra, để chuyển đổi sang giờ địa phương khá dễ dàng: sử dụng ... - Date.getTimezoneOffset() * 60 * 1000(NB cũng điều chỉnh theo Giờ tiết kiệm ánh sáng ban ngày nếu có).
mike gặm nhấm

14

Giá trị thời gian JS cho MySQL

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

HOẶC LÀ

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

HOẶC LÀ

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

bạn có thể gửi cái này trong params nó sẽ hoạt động.


11

Đối với chuỗi ngày tùy ý,

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

Hoặc một giải pháp dòng đơn,

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

Giải pháp này cũng hoạt động cho Node.js khi sử dụng Dấu thời gian trong mysql.

Câu trả lời đầu tiên của @Gajus Kuizinas dường như sửa đổi nguyên mẫu toISOString của mozilla


4

Thư viện DateJS đáng kính có thói quen định dạng (ghi đè ".toString ()"). Bạn cũng có thể tự làm một cách khá dễ dàng vì các phương thức "Ngày" cung cấp cho bạn tất cả các số bạn cần.


4

Cách giải quyết đầy đủ (để xác định múi giờ) bằng khái niệm câu trả lời @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

4

Ngày mới (). toISOString (). lát (0, 10) + "" + Ngày mới (). toLocaleTimeString ('en-GB');

Làm việc 100%


0

Tôi đã đưa ra các ví dụ định dạng ngày JavaScript đơn giản, vui lòng kiểm tra mã dưới đây

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

Sử dụng khoảnh khắc

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

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

Ví dụ vui lòng kiểm tra https://jsfiddle.net/sjy3vjwm/2/


Tôi vừa thử mã đầu tiên của bạn với javilla javascript và nó cho tôi kết quả này: 2018-4-20 15:11:23. Bạn không đệm các số bằng "0" hàng đầu. Ngoài ra, tôi không biết về khoảnh khắc nhưng bạn không phải đặt "HH" hàng giờ để nó đệm nó? Có lẽ đó là lý do tại sao bạn đã bỏ phiếu? (itwasntme)
Alex

0

Cách chính xác nhất dễ dàng nhất để chuyển đổi định dạng ngày tháng của SQL sang định dạng thời gian SQL xảy ra với tôi là cách này. Nó xử lý chính xác thời gian bù.

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

Coi chừng câu trả lời của @Paulo Roberto sẽ tạo ra kết quả không chính xác vào lượt vào ngày mới (tôi không thể để lại nhận xét). Ví dụ :

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 

Chúng tôi đã có ngày 22 tháng 6 thay vì 23!


0
var _t = new Date();

nếu bạn muốn định dạng UTC đơn giản

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

hoặc là

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

và nếu muốn trong múi giờ cụ thể thì

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

0

Tôi đang sử dụng thời gian dài này và nó rất hữu ích cho tôi, sử dụng như bạn muốn

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

và sau đó chỉ:

new Date().date()

trong đó trả về ngày hiện tại ở 'định dạng MySQL'

để thêm thời gian là

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

sẽ thêm 30 phút .... và cứ thế

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.