Tanggal baru () berfungsi di Chrome tetapi tidak berfungsi di Firefox

93

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?

pixeldev
sumber
2
jika Anda ingin memainkannya dengan cara apa pun yang Anda inginkan, gunakan datejs.com
Sinan
Tidak semua implementasi mendukung format di ECMA-262 jadi selalu parse string secara manual (pustaka dapat membantu tetapi kemungkinan tidak diperlukan untuk format tunggal).
RobG
Ini berfungsi Firefox sekarang.
Sm Yamashita

Jawaban:

80

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.

Chris Laplante
sumber
4
Saya mendapat solusi yang berfungsi di semua browser termasuk Firefox: stackoverflow.com/a/21984717/586051
Rahul Desai
7
Mengenai mengapa perbedaan browser ini ada: 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-ditentukan], fungsi dapat kembali ke heuristik khusus penerapan atau format tanggal khusus penerapan. "Chrome dan FF hanya memiliki" format tanggal khusus penerapan "yang berbeda.
apsillers
Salah satu contoh format tanggal (bulan yang menyertakan ".") Yang berfungsi di Chrome tetapi tidak di Firefox: 'Feb. 14, 2019 '
Codescribblr
Ini hanya berfungsi untuk saya di firefox jika saya menambahkan 'ke milidetik Date('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.
Steve
24

Ini berfungsi di semua browser -

Tanggal baru ('2001/01/31 12:00:00 AM')

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

Tahin Rahman
sumber
karena kita semua tahu itu standar internasional. w3.org/International/questions/qa-date-format
Bobby Tables
6
Jadi, Anda benar-benar telah menguji semua browser ? Dan anggap saja Anda pernah, Anda juga tahu bahwa semua browser di masa mendatang juga akan mendukung format (non-standar) itu?
RobG
1
Ini berhasil untuk saya. Jadi jika Anda sudah mendapatkan string '2001-1-31 12:00:00', kita cukup melakukan: new Date (str.replace (/ - / g, '/'));
Jianwu Chen
@JianwuChen Anda sengaja mengubah format standar menjadi nonstandar. Bukan ide yang bagus.
JJJ
2
Setelah 3 tahun kemudian, itu tidak berfungsi di Edge dan Window Safari.
Mg Thar
13

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

John Slegers
sumber
1
var d = new Date ('2017-08-28 08:02 PM'. ganti (/ - / g, '/')); Ini bekerja sempurna untuk saya di chrome juga di mozilla.
Rahul Mankar
13

Ini juga berfungsi di sebagian besar browser

new Date('2001/01/31 12:00:00')

Itu adalah format

"yyyy/MM/dd HH:mm:ss"
Alvis
sumber
3
Tidak ada jaminan bahwa format akan berfungsi di browser apa pun, apalagi "semua".
RobG
Anda benar tentang itu, jawabannya berdasarkan pengalaman saya.
Alvis
8

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

Gabrielius
sumber
1
Ya, chrome dan firefox berperilaku berbeda jika Anda tidak menyediakan zona waktu. Dan, karena minat saya pikir firefox salah melakukannya. Ini harus mengasumsikan GMT jika zona waktu tidak ada. Chrome melakukannya, firefox tidak. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs
@ JulianJelfs— " Seharusnya menganggap GMT jika zona waktu tidak ada ", hanya untuk tanggal (bertentangan dengan ISO 8601). Untuk string tanggal dan waktu, harus dianggap lokal (sesuai dengan ISO 8601). Namun bagaimanapun, penguraian manual adalah satu-satunya cara yang aman untuk melakukannya.
RobG
5

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.

Foto
sumber
Anda harus selalu meneruskan format ke moment.js saat mem- parsing string, jika tidak maka format hanya menebak sampai menemukan salah satu yang membuat tanggal yang valid.
RobG
4

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));
Bartek Kosa
sumber
2

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);
XORG_99
sumber
1

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.

bjo
sumber
1

Inilah yang berhasil untuk saya Firefoxdan Chrome:

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

Aakash
sumber
0

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 )

String yang mewakili tanggal RFC2822 atau ISO 8601 (format lain mungkin digunakan, tetapi hasilnya mungkin tidak terduga).

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.

Haimei
sumber
0

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, contoh 2010-07-15 11:54:21harus diubah menjadi 2010-07-15T11:54:21Zatau 2010-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>

Tommy
sumber
-1

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.

Shahrukh Azeem
sumber
Ini tidak menjelaskan penyebab masalah melainkan apa hasil dari masalah tersebut.
Rytis
-1

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