new Date () Chrome'da çalışıyor ancak Firefox'ta çalışmıyor


93

Şuna benzeyen bir tarih saat dizesi oluşturuyorum: 2010-07-15 11:54:21

Ve aşağıdaki kodla Firefox'ta geçersiz tarih alıyorum ama Chrome'da gayet iyi çalışıyor

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);

Firefox'ta date1 bana geçersiz bir tarih veriyor, ancak kromda gayet iyi çalışması ana neden ne olurdu?


2
onunla herhangi bir şekilde oynamak istiyorsanız datejs.com
Sinan

Tüm uygulamalar ECMA-262'deki biçimi desteklemediğinden dizeleri her zaman manuel olarak ayrıştırın (bir kitaplık yardımcı olabilir, ancak tek biçimler için muhtemelen gerekli değildir).
RobG

Artık Firefox çalışıyor.
Sm Yamashita

Yanıtlar:


80

Bir tarih nesnesini istediğiniz gibi başlatamazsınız. Belirli bir şekilde olması gerekir. İşte bazı geçerli örnekler:

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)

veya

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 daha esnek olmalı.

Kaynak: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

Gönderen apsillers comment:

EMCAScript spesifikasyonu tam olarak bir tarih formatı gerektirir (yani, YYYY-AA-GGTHH: dd: ss.sssZ) ancak özel tarih formatları bir uygulama tarafından serbestçe desteklenebilir : " Dize bu [ECMAScript tanımlı] formatına uymuyorsa işlev, herhangi bir uygulamaya özgü buluşsal yöntemlere veya uygulamaya özgü tarih biçimlerine geri dönebilir. "Chrome ve FF, yalnızca" uygulamaya özgü farklı tarih biçimlerine "sahiptir.


4
Firefox dahil tüm tarayıcılarda çalışan bir çözüm buldum: stackoverflow.com/a/21984717/586051
Rahul Desai

7
Bu tarayıcı farkının neden mevcut olduğuna gelince: EMCAScript belirtimi tam olarak bir tarih biçimi (yani, YYYY-MM-DDTHH:mm:ss.sssZ) gerektirir ancak özel tarih biçimleri bir uygulama tarafından serbestçe desteklenebilir : " Dize bu [ECMAScript tanımlı] biçimine uymuyorsa, işlev herhangi bir uygulamaya özgü buluşsal yöntemlere veya uygulamaya özgü tarih biçimlerine geri dönün. "Chrome ve FF, yalnızca" uygulamaya özgü farklı tarih biçimlerine "sahiptir.
apsillers

Chrome'da çalışan ancak Firefox'ta çalışmayan bir tarih biçimi örneği ("." İçeren ay): "Şub. 14, 2019 '
codescribblr

Bu sadece benim için firefox'ta işe yaradı ', milisaniyeye eklersem, Date('milliseconds')aksi takdirde milisaniyelerin tanımlanmadığını söyleyen bir hata aldım, ancak en azından diğer birçok denemenin başarısız olduğu yerde çalıştı. Hala Chrome'da mutlu görünüyor.
Steve

24

Bu tüm tarayıcılarda çalışır -

yeni Tarih ('2001/01/31 12:00:00 AM')

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

Biçim: YYYY-AA-GGTHH: mm: ss.sss

Ayrıntılar: http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15


çünkü bunun uluslararası bir standart olduğunu hepimiz biliyoruz. w3.org/International/questions/qa-date-format
Bobby Tables

6
Yani aslında tüm tarayıcıları test ettiniz mi? Ve sahip olduğunuzu varsayarsak, gelecekte tüm tarayıcıların da bu (standart olmayan) biçimi destekleyeceğini de biliyorsunuz.
RobG

1
Bu benim için çalışıyor. Dolayısıyla, zaten '2001-1-31 12:00:00' dizesini alırsanız, şunu yapabiliriz: new Date (str.replace (/ - / g, '/'));
Jianwu Chen

@JianwuChen Standart bir formatı kasıtlı olarak standart olmayana değiştiriyorsunuz. İyi bir fikir değil.
JJJ

2
3 yıl sonra Edge ve Window Safari'de çalışmıyor.
Mg Thar

13

Seçenek 1 :

Zaman damganızın şuna benzeyen bir formata sahip olduğunu varsayalım:

'2016-03-10 16:00:00.0'

Bu durumda, bunu şuna dönüştürmek için basit bir normal ifade yapabilirsiniz ISO 8601:

'2016-03-10 16:00:00.0'.replace(/ /g,'T')

Bu, aşağıdaki çıktıyı üretecektir:

'2016-03-10T16:00:00.0'

Bu, standart tarih saat biçimidir ve bu nedenle tüm tarayıcılar tarafından desteklenir:

document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE

Seçenek 2 :

Zaman damganızın şuna benzeyen bir formata sahip olduğunu varsayalım:

'02-24-2015 09:22:21 PM'

Burada aşağıdaki normal ifadeyi yapabilirsiniz:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

Bu da tüm tarayıcılar tarafından desteklenen bir format oluşturur:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE

3. Seçenek:

İyi desteklenen standartlardan birine ayarlanması kolay olmayan bir zaman dizeniz olduğunu varsayalım.

Bu durumda, zaman dizenizi farklı parçalara ayırmak ve bunları aşağıdakiler için ayrı parametreler olarak kullanmak en iyisidir Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE


1
var d = yeni Tarih ('2017-08-28 08:02 PM'.replace (/ - / g,' / ')); Bu benim için kromda ve mozilla'da mükemmel çalışıyor.
Rahul Mankar

13

Bu, çoğu tarayıcıda da çalışır

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

Bu formatıdır

"yyyy/MM/dd HH:mm:ss"

3
Biçimin herhangi bir tarayıcıda çalışacağının garantisi yoktur, "tümü" hariç.
RobG

Bu konuda haklısın, cevap benim deneyimime dayanıyor.
Alvis

8

Yine de tire kullanarak tarih oluşturmak istiyorsanız, şu biçimi kullanabilirsiniz:

var date = new Date('2013-08-31T17:00:00Z')

Ancak, UTC'ye göre zamanı yarattığını unutmayın. Yani, GMT + 3 (GMT'nin 3 saat ilerisinde) saat diliminde yaşıyorsanız, bu saat dilimi farkını saate ekleyecektir. Dolayısıyla, GMT + 3 ise yukarıdaki örnek şu değere sahip olacaktır (bunun 17:00 değil saat 20:00 olduğuna dikkat edin):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)

Sonuna 'Z' harfini eklediğinizden emin olun, çünkü aksi takdirde Chrome ve Firefox dizeyi farklı şekilde ayrıştırır (biri zaman farkı ekler, diğeri ise olmaz).


1
Evet, bir saat dilimi belirtmezseniz, chrome ve firefox farklı davranır. Ve ilgisizlikten firefox'un yanlış yaptığını düşünüyorum. Saat dilimi yoksa GMT'yi varsaymalıdır. Chrome yapar, firefox bunu yapmaz. ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Julian Jelfs

@ JulianJelfs— " Saat dilimi yoksa GMT varsayılmalıdır ", yalnızca tarih için (ISO 8601'in aksine). Tarih ve saat dizileri için yerel varsayılmalıdır (ISO 8601 ile uyumlu). Ancak her durumda, el ile ayrıştırma, gitmenin tek güvenli yoludur.
RobG

5

AngularJS ile çalışırken hem Firefox hem de Safari'de benzer bir sorun yaşıyordum. Örneğin, Angular'dan döndürülen bir tarih şöyle görünüyorsa:

2014-06-02 10:28:00

bu kodu kullanarak:

new Date('2014-06-02 10:28:00').toISOString();

Firefox ve Safari'de geçersiz bir tarih hatası döndürür. Ancak Chrome'da iyi çalışıyor. Başka bir yanıtın da belirttiği gibi, Chrome büyük olasılıkla tarih dizelerini ayrıştırma konusunda daha esnektir.

Nihai hedefim, tarihi belirli bir şekilde biçimlendirmekti. Hem tarayıcılar arası uyumluluk sorununu hem de tarih biçimlendirme sorununu ele alan mükemmel bir kitaplık buldum. Kitaplığa moment.js adı verilir .

Bu kitaplığı kullanarak aşağıdaki kod, test ettiğim tüm tarayıcılarda doğru şekilde çalışır:

moment('2014-06-02 10:28:00').format('MMM d YY')

Bu ekstra kitaplığı uygulamanıza dahil etmeye istekliyseniz, olası tarayıcı uyumluluğu sorunlarını önlerken tarih dizenizi daha kolay oluşturabilirsiniz. Bonus olarak, gerekirse tarihleri ​​kolayca biçimlendirmek, eklemek, çıkarmak vb. İçin iyi bir yolunuz olacak.


Sen gerektiğini hep formatında geçmesi moment.js dizeleri ayrıştırma zaman geçerli bir tarih yaratır bulana kadar aksi takdirde sadece tahmin.
RobG

4

Bu sizin için çalışmalı:

var date1 = new Date(year, month, day, hour, minute, seconds);

Bir dizeden tarih oluşturmam gerekiyordu, bu yüzden bunu şöyle yaptım:

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

JavaScript'teki ayların 0 ile 11 arasında olduğunu unutmayın, bu nedenle ay değerini aşağıdaki gibi 1 azaltmalısınız:

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

2

Basit Çözüm, Bu Tüm Tarayıcılarda çalışır,

var StringDate = "24-11-2017"   
var DateVar = StringDate.split("-");
var DateVal = new Date(DateVar[1] + "/" + DateVar[0] + "/" + DateVar[2]);
alert(DateVal);

1

Karşılaştığım bir durum, milisaniyelerle uğraşırken oldu. FF ve IE, yeni bir tarih oluşturmaya çalışırken bu tarih dizesini doğru şekilde ayrıştırmayacaktır. "2014/11/24 17:38:20.177Z" Nasıl başa çıkacaklarını bilmiyorlar .177Z. Chrome yine de çalışacak.


1

Bu benim için işe yarayan şeydi Firefoxve 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.

İyi şanslar...


0

Aslında, Chrome farklı dize biçimleriyle başa çıkmak için daha esnektir. String formatını anlamasanız bile, Chrome yine de String'i hatasız bir şekilde Tarihe dönüştürebilir. Bunun gibi:

  var outputDate = new Date(Date.parse(inputString));

Ancak Firefox ve Safari için işler daha karmaşık hale geliyor. Aslında, Firefox'un belgesinde zaten şöyle diyor: ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse )

RFC2822 veya ISO 8601 tarihini temsil eden bir dize (diğer formatlar kullanılabilir, ancak sonuçlar beklenmedik olabilir).

Bu yüzden Firefox ve Safari'de Date.parse kullanmak istediğinizde dikkatli olmalısınız. Benim için bununla başa çıkmak için bir hile yöntemi kullanıyorum. (Not: tüm durumlar için her zaman doğru olmayabilir)

if (input.indexOf("UTC") != -1) {
  var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z";
  date = new Date(Date.parse(tempInput));
}

İşte dönüştürür 2013/08/08 11:52:18 UTC için 52: 2013-08-08T11 18Z ilk ve daha sonra onun biçimi Firefox'un belgede uyum kelime. Şu anda, Date.parse herhangi bir tarayıcıda her zaman doğru olacaktır.


0

Herhangi bir tarayıcı (Firefox ve Safari dahil) tarafından ayrıştırılabilmesi gereken olası tarih dizelerini tanımlayan bir W3C özelliği vardır :

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)

nerede

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)

Buna göre YYYY-MM-DDThh:mmTZD, örneğin 2010-07-15 11:54:21ya ya 2010-07-15T11:54:21Zda 2010-07-15T11:54:21+02:00(ya da başka bir zaman dilimiyle) dönüştürülmesi gerekir .

Her bir varyantın sonuçlarını gösteren kısa bir örnek:

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>


-1

Firefox'ta, herhangi bir geçersiz Tarih, Tarih olarak bir Date nesnesi olarak döndürülür 1899-11-29T19:00:00.000Z, bu nedenle tarayıcının Firefox olup olmadığını kontrol edin ve ardından string'in Date nesnesini alın "1899-11-29T19:00:00.000Z".getDate(). Sonunda tarih ile karşılaştırın.


Bu, sorunun nedenini açıklamaz, daha ziyade sorunun sonucunun ne olacağını açıklar.
Rytis

-1

Aşağıdaki tarih formatını kullandım ve tüm tarayıcılarda çalışıyor.

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.