Saya membuat string datetime yang terlihat seperti ini: 2010-07-15 11:54:21
Dan dengan kode berikut saya mendapatkan tanggal tidak valid di Firefox tetapi berfungsi dengan baik di Chrome
var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);
Di firefox date1 memberi saya tanggal tidak valid, tetapi di chrome berfungsi dengan baik apa penyebab utamanya?
javascript
google-chrome
date
datetime
firefox
pixeldev
sumber
sumber
Jawaban:
Anda tidak dapat membuat instance objek tanggal dengan cara apa pun yang Anda inginkan. Itu harus dengan cara tertentu. Berikut beberapa contoh yang valid:
new Date() // current date and time new Date(milliseconds) //milliseconds since 1970/01/01 new Date(dateString) new Date(year, month, day, hours, minutes, seconds, milliseconds)
atau
d1 = new Date("October 13, 1975 11:13:00") d2 = new Date(79,5,24) d3 = new Date(79,5,24,11,33,0)
Chrome harus lebih fleksibel.
Sumber: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
Dari komentar apsillers :
spesifikasi EMCAScript membutuhkan tepat satu format tanggal (yaitu, YYYY-MM-DDTHH: mm: ss.sssZ) tetapi format tanggal kustom dapat didukung secara bebas oleh implementasi : " Jika String tidak sesuai dengan format [ECMAScript-defined] itu fungsi tersebut dapat kembali ke heuristik khusus penerapan atau format tanggal khusus penerapan. "Chrome dan FF hanya memiliki" format tanggal khusus penerapan "yang berbeda.
sumber
YYYY-MM-DDTHH:mm:ss.sssZ
) tetapi format tanggal kustom dapat didukung secara bebas oleh implementasi : " Jika String tidak sesuai dengan format [ECMAScript-ditentukan], fungsi dapat kembali ke heuristik khusus penerapan atau format tanggal khusus penerapan. "Chrome dan FF hanya memiliki" format tanggal khusus penerapan "yang berbeda.'
ke milidetikDate('milliseconds')
jika tidak, saya mendapat kesalahan yang mengatakan bahwa milidetik tidak ditentukan tetapi setidaknya berhasil, di mana banyak uji coba lainnya gagal. Sepertinya masih senang di Chrome.Ini berfungsi di semua browser -
new Date('2001-01-31 12:00:00')
Format: TTTT-BB-HHTJJ: mm: ddd
Detail: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
sumber
Pilihan 1 :
Misalkan timestring Anda memiliki format seperti ini:
'2016-03-10 16:00:00.0'
Dalam hal ini, Anda dapat melakukan regex sederhana untuk mengubahnya menjadi
ISO 8601
:'2016-03-10 16:00:00.0'.replace(/ /g,'T')
Ini akan menghasilkan keluaran berikut:
'2016-03-10T16:00:00.0'
Ini adalah format tanggal waktu standar, dan karenanya didukung oleh semua browser:
document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE
Pilihan 2 :
Misalkan timestring Anda memiliki format seperti ini:
'02-24-2015 09:22:21 PM'
Di sini, Anda dapat melakukan regex berikut:
'02-24-2015 09:22:21 PM'.replace(/-/g,'/');
Ini juga menghasilkan format yang didukung oleh semua browser:
document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE
Opsi 3:
Misalkan Anda memiliki string waktu yang tidak mudah disesuaikan dengan salah satu standar yang didukung dengan baik.
Dalam hal ini, sebaiknya pisahkan string waktu Anda menjadi beberapa bagian dan gunakan sebagai parameter individual untuk
Date
:document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE
sumber
Ini juga berfungsi di sebagian besar browser
new Date('2001/01/31 12:00:00')
Itu adalah format
"yyyy/MM/dd HH:mm:ss"
sumber
Jika Anda masih ingin membuat tanggal menggunakan tanda hubung, Anda dapat menggunakan format ini:
var date = new Date('2013-08-31T17:00:00Z')
Namun perlu diingat, bahwa ini menciptakan waktu menurut UTC. Artinya, jika Anda tinggal dalam zona waktu GMT + 3 (3 jam lebih awal dari GMT), pengimbangan zona waktu ini akan ditambahkan ke waktu. Jadi contoh di atas akan memiliki nilai ini, jika GMT + 3 (perhatikan bahwa ini adalah jam 20:00 dan bukan 17:00):
Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)
Pastikan untuk menambahkan huruf 'Z' di akhir, karena jika tidak Chrome dan Firefox akan mengurai string secara berbeda (satu akan menambahkan offset waktu dan yang lainnya tidak).
sumber
Saya mengalami masalah serupa di Firefox dan Safari saat bekerja dengan AngularJS. Misalnya, jika tanggal yang dikembalikan dari Angular terlihat seperti ini:
2014-06-02 10:28:00
menggunakan kode ini:
new Date('2014-06-02 10:28:00').toISOString();
mengembalikan kesalahan tanggal tidak valid di Firefox dan Safari. Namun di Chrome itu berfungsi dengan baik. Seperti jawaban lain yang dinyatakan, Chrome kemungkinan besar lebih fleksibel dengan parsing string tanggal.
Tujuan akhir saya adalah memformat tanggal dengan cara tertentu. Saya menemukan perpustakaan luar biasa yang menangani masalah kompatibilitas lintas browser dan masalah pemformatan tanggal. Pustaka tersebut disebut moment.js .
Menggunakan pustaka ini, kode berikut berfungsi dengan benar di semua browser yang saya uji:
moment('2014-06-02 10:28:00').format('MMM d YY')
Jika Anda ingin memasukkan pustaka tambahan ini ke dalam aplikasi Anda, Anda dapat dengan lebih mudah membuat string tanggal Anda sambil menghindari kemungkinan masalah kompatibilitas browser. Sebagai bonus, Anda akan memiliki cara yang baik untuk memformat, menambah, mengurangi, tanggal dll dengan mudah jika diperlukan.
sumber
Ini seharusnya berhasil untuk Anda:
var date1 = new Date(year, month, day, hour, minute, seconds);
Saya harus membuat tanggal dari string jadi saya melakukannya seperti ini:
var d = '2013-07-20 16:57:27'; var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
Ingatlah bahwa bulan di javascript adalah dari 0 hingga 11, jadi Anda harus mengurangi nilai bulan sebesar 1, seperti ini:
var d = '2013-07-20 16:57:27'; var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2));
sumber
Solusi Sederhana, Ini bekerja dengan Semua Browser,
var StringDate = "24-11-2017" var DateVar = StringDate.split("-"); var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]); alert(DateVal);
sumber
Satu situasi yang saya hadapi adalah ketika berurusan dengan milidetik. FF dan IE tidak akan mengurai string tanggal ini dengan benar saat mencoba membuat tanggal baru.
"2014/11/24 17:38:20.177Z"
Mereka tidak tahu bagaimana menanganinya.177Z
. Chrome akan berfungsi.sumber
Inilah yang berhasil untuk saya
Firefox
danChrome
:// The format is 'year-month-date hr:mins:seconds.milliseconds' const d = new Date('2020-1-4 12:00:00.999') // we use the `.` separator between seconds and milliseconds.
Semoga berhasil...
sumber
Faktanya, Chrome lebih fleksibel untuk menangani format string yang berbeda. Bahkan jika Anda tidak mengetahui format String-nya, Chrome masih dapat berhasil mengonversi String menjadi Tanggal tanpa kesalahan. Seperti ini:
var outputDate = new Date(Date.parse(inputString));
Tetapi untuk Firefox dan Safari, segalanya menjadi lebih kompleks. Faktanya, di dokumen Firefox, sudah tertulis: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )
Jadi, ketika Anda ingin menggunakan Date.parse di Firefox dan Safari, Anda harus berhati-hati. Bagi saya, saya menggunakan metode trik untuk menghadapinya. (Catatan: mungkin tidak selalu benar untuk semua kasus)
if (input.indexOf("UTC") != -1) { var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z"; date = new Date(Date.parse(tempInput)); }
Di sini ia mengubah 2013-08-08 11:52:18 UTC menjadi 2013-08-08T11: 52: 18Z terlebih dahulu, dan kemudian formatnya adalah kata-kata yang sesuai dalam dokumen Firefox. Saat ini, Date.parse akan selalu ada di browser mana pun.
sumber
Ada spesifikasi W3C yang menentukan kemungkinan string tanggal yang harus dapat diurai oleh browser apa pun (termasuk Firefox dan Safari):
Year: YYYY (e.g., 1997) Year and month: YYYY-MM (e.g., 1997-07) Complete date: YYYY-MM-DD (e.g., 1997-07-16) Complete date plus hours and minutes: YYYY-MM-DDThh:mmTZD (e.g., 1997-07-16T19:20+01:00) Complete date plus hours, minutes and seconds: YYYY-MM-DDThh:mm:ssTZD (e.g., 1997-07-16T19:20:30+01:00) Complete date plus hours, minutes, seconds and a decimal fraction of a second YYYY-MM-DDThh:mm:ss.sTZD (e.g., 1997-07-16T19:20:30.45+01:00)
dimana
YYYY = four-digit year MM = two-digit month (01=January, etc.) DD = two-digit day of month (01 through 31) hh = two digits of hour (00 through 23) (am/pm NOT allowed) mm = two digits of minute (00 through 59) ss = two digits of second (00 through 59) s = one or more digits representing a decimal fraction of a second TZD = time zone designator (Z or +hh:mm or -hh:mm)
Menurutnya
YYYY-MM-DDThh:mmTZD
, contoh2010-07-15 11:54:21
harus diubah menjadi2010-07-15T11:54:21Z
atau2010-07-15T11:54:21+02:00
(atau dengan zona waktu lain).Berikut adalah contoh singkat yang menunjukkan hasil setiap varian:
const oldDateString = '2010-07-15 11:54:21' const newDateStringWithoutTZD = '2010-07-15T11:54:21Z' const newDateStringWithTZD = '2010-07-15T11:54:21+02:00' document.getElementById('oldDateString').innerHTML = (new Date(oldDateString)).toString() document.getElementById('newDateStringWithoutTZD').innerHTML = (new Date(newDateStringWithoutTZD)).toString() document.getElementById('newDateStringWithTZD').innerHTML = (new Date(newDateStringWithTZD)).toString()
div { padding: 10px; }
<div> <strong>Old Date String</strong> <br> <span id="oldDateString"></span> </div> <div> <strong>New Date String (without Timezone)</strong> <br> <span id="newDateStringWithoutTZD"></span> </div> <div> <strong>New Date String (with Timezone)</strong> <br> <span id="newDateStringWithTZD"></span> </div>
sumber
Di Firefox, Tanggal yang tidak valid dikembalikan sebagai objek Tanggal sebagai Tanggal
1899-11-29T19:00:00.000Z
, oleh karena itu periksa apakah browser adalah Firefox kemudian dapatkan objek Tanggal dari string"1899-11-29T19:00:00.000Z".getDate()
. Terakhir bandingkan dengan tanggalnya.sumber
Saya telah menggunakan format tanggal berikut dan berfungsi di semua browser.
var target_date = new Date("Jul 17, 2015 16:55:22").getTime(); var days, hours, minutes, seconds; var countdown = document.getElementById("countdown"); remaining = setInterval(function () { var current_date = new Date().getTime(); var seconds_left = (target_date - current_date) / 1000; days = parseInt(seconds_left / 86400); seconds_left = seconds_left % 86400; hours = parseInt(seconds_left / 3600); seconds_left = seconds_left % 3600; minutes = parseInt(seconds_left / 60); seconds = parseInt(seconds_left % 60); countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, " + minutes + " minute, " + seconds + " second.</b>"; }, 1000);
sumber