Javascript belirli bir zamanda. TempusJS - javascript'te tarihle çalışma. Otomatik tarih algılama ve ayrıştırma


JavaScript'te tarih ve saatle çalışmak için özel bir nesne var - Tarih. Bu nesne, JavaScript'in hemen hemen tüm sürümleri tarafından desteklenmektedir ve uyumluluk sorunları için geriye bakmadan kullanabilirsiniz.

Date nesnesindeki tarih ve saat açıkça depolanmaz, ancak çoğu programlama dilinde olduğu gibi - Unix'in doğumundan bu yana geçen milisaniye sayısı biçiminde, yani 0 saat 0 dakika 1 Ocak 1970. Date nesnesinin ayırt edici bir özelliği, tüm aralık değerlerinin sıfır ile başlayan dizinlere sahip olmasıdır. Bu, Ocak ayının 0 (0 numaralı ay) endeksine sahip olacağı ve Aralık'ın on ikinci değil on birinci ay olacağı anlamına gelir. Aynısı haftanın günleri, saatler, dakikalar vb. İçin de geçerlidir.

Bir Date nesnesi oluşturmak çok kolaydır:

// geçerli tarih-saat var date \u003d new Date (); // dizeden veya numaradan tarih-saat var date \u003d new Date (tarih); // ayrı değerlerden tarih-saat var date \u003d new Date (yıl, ay, gün, saat, dakika, saniye, milisaniye);

Date nesnesi, tek tek tarih-saat bileşenleriyle çalışmanıza ve ayrıca doğruluğunu kontrol etmenize ve belirli bir biçimde doğru tarihi görüntülemenize olanak tanıyan çok sayıda yararlı yönteme sahiptir.

Tarih-saat bileşenlerini alma yöntemleri
getFullYear Yılı döndürür (örneğin, 2011).
getYear Yılı döndürür. GetYear yönteminin amacı getFullYear'ın amacına benzer, ancak bu yöntem kullanımdan kaldırılmış ve kullanımdan kaldırılmıştır. Çalışmasının sonuçları belirsizdir: 1900 ile 1999 arasındaki tarih aralığı için, yöntem yüzyıldaki yılın numarasını (iki basamaklı, örneğin 77) döndürür ve bu aralığın dışındaki tarihler için tam değer (örneğin, dört basamaklı, 2009) döndürülür.
getMonth Ayı döndürür.
getDate Ayın gününü (aydaki sayı) verir.
getHours Saati döndürür.
getMinutes Dakikayı döndürür.
getSeconds İkinciyi döndürür.
getMilliseconds Milisaniyeyi döndürür.
getDay Haftanın gününü döndürür.
getTime Nesne tarafından saklanan milisaniye ofseti döndürür.
Tarih ve saat bileşenlerini değiştirme yöntemleri
setFullYear Yılı ayarlar.
setYear Yılı ayarlar. SetYear yöntemi setFullYear ile aynı işleve sahiptir, ancak bu yöntem kullanımdan kaldırılmıştır ve kullanımdan kaldırılmıştır (ayrıca getYear yöntemi de).
setMonth Ayı ayarlar.
tarih ayarla Ay içindeki tarihi ayarlar (ayın günü).
setHours Saati ayarlar.
setMinutes Dakikayı ayarlar.
setSeconds İkinciyi ayarlar.
setMilliseconds Milisaniyeyi ayarlar.
ayarlanan zaman 00:00:00 01/01/1970 milisaniye ofsetini ayarlar
Tarih-Saat Biçimlendirme ve Çıktı İşlevleri
toString Tarih ve saatin dize olarak temsilini döndürür.
toUTCString UTC saatine dönüştürülmüş tarih ve saatin dize gösterimini döndürür. Döndürülen dizenin biçimi tüm İnternet standartlarına dayanmaktadır.
toGMTString GMT'ye (Greenwich Ortalama Saati) dönüştürülmüş tarih ve saatin bir dize gösterimini döndürür. Döndürülen dizenin biçimi tüm İnternet standartlarına dayanmaktadır.
toLocaleString Dizgiye benzer, ancak kullanıcının yerelleştirme ayarlarına göre biçimlendirilmiş tarih ve saatin bir dize gösterimini döndürür.
toTimeString Zamanın dize gösterimini döndürür (dize yalnızca saati içerir).
toDateString Tarihin dize gösterimini döndürür (dize yalnızca tarihi içerir).
toLocaleTimeString TimeString'e benzer, ancak kullanıcının yerelleştirme ayarlarına göre biçimlendirilmiş zamanın bir dize gösterimini döndürür.
toLocaleDateString DateString'e benzer, ancak kullanıcının yerelleştirme ayarlarına göre biçimlendirilmiş tarihin bir dize gösterimini döndürür.
İlave fonksiyonlar
getTimezoneOffset Kullanıcının bilgisayarındaki yerel saatin UTC'ye göre farkını döndürür. Ofset dakikalar içinde iade edilir.
ayrıştırmak İşlev, bir dizi olarak yazılan tarih-saatin doğruluğunu kontrol etmenizi sağlar. Dize doğruysa, hemen bir Date nesnesi oluşturulur.

Date nesnesi ayrıca UTC tarihleriyle çalışmak için bir dizi yöntem içerir. Bu işlevler, daha önce dikkate alınanlara tamamen benzer, ancak adlarında "UTC" ön ekini içerirler ve yalnızca "evrensel" zamanla çalışırlar: getUTCSeconds, setUTCFullYear, vb.

Tarihlerle çalışmanın bir örneğini ele alalım:

Ve işte bu komut dosyasının sonucu:


Gördüğünüz gibi, tarihin temsili kullanılan formata bağlı olarak önemli ölçüde farklılık gösterir. Bu nedenle, tarih-saat ile çalışırken birkaç basit kurala uymanız gerekir:

1. Mümkün olduğunda UTC veya GMT biçimlerini kullanın. Bu, özellikle dağıtılmış çözümler oluştururken önemlidir (örneğin, ödeme sistemleri müşterileri). Ortak bir referans süresi kullanmak, sizin ve uzak ortağınızın alınan verileri aynı şekilde yorumlayacağına dair size garanti verecektir (yüzde yüz olmasa da).

2. Yerelleştirilmiş tarih ve saati yalnızca kullanıcıya görüntülerken kullanmak mantıklıdır. Diğer tüm durumlarda, yerelleştirilmiş verileri reddetmek daha iyidir.

3. Yine de yerel bir tarih ve saat kullanmanız gerekiyorsa - yerel saatin referans saate (UTC veya GMT) göre farkını hesaba katmayı unutmayın.

Bu kurallara uymak sizi çoğu mantıksal hatadan ve eksikliklerden kurtaracaktır, bu da kodunuzu daha kararlı ve yüksek kaliteli hale getireceği anlamına gelir.

Bir programcının tarih ve saatlerle çalışmaktan kaçınması nadirdir. Genel olarak, tarih / saat temel bir kavramdır ve çoğu dilde bu veri türüyle çalışmak için yerleşik mekanizmalar vardır. Görünüşe göre JS bir istisna değil, yerleşik bir Tarih türü var, prototipte bir sürü işlev var, ancak ...

Suçlu kim
İlk sorun, tarihi / saati UTC ve yerel dışında bir saat diliminde ayarlamanız gerektiğinde ortaya çıkar. Date yapıcısının böyle bir parametresi yoktur.

Yeni tarih (); yeni Tarih (değer); new Date (dateString); yeni Tarih (yıl, ay [, gün [, saat [, dakika [, saniye [, milisaniye]]]]);
UTC'ye göre bir uzaklık belirleyebileceğiniz tek seçenek üçüncü yoldur. Bu biçimdeki bir yapıcı çağrısı, ofseti dizenin bir parçası olarak iletmenize olanak tanır:

Yeni Tarih ("01 Şubat 1998 Pazar 00:00:00 GMT + 0700")
Dize, RFC2822 biçiminde kabul edilir, bu çok zahmetli ve manuel giriş için zordur. Kullanıcı girdisinden böyle bir dizge elde etmek neredeyse imkansızdır. Bu formatta bir tarih girmeyi kabul edecek birini hayal edemiyorum.

Tarih bölümünde tüm parametreleri UTC saat dilimi için ayrı ayrı ayarlayabilmenize rağmen - bu sorunu çözmez - saat dilimi yerel kalacaktır. Ancak tek sorun bu değil.

UTC uzaklığı sabit değildir. Bu, tarihin, saatin (veya isterseniz bir zaman damgasının) ve yine bir saat diliminin bir işlevidir. Örneğin, Moskova için son kez çeviri şunları verir:

Yeni Tarih (2014, 9, 25, 0, 0, 0); // 26.10.2014, 21:00:00 GMT + 3 yeni Tarih (2014, 9, 27, 0, 0, 0); // 25.10.2014, 22:00:00 GMT + 4
Böylece, üçüncü seçenekteki kurucu, ofsetin önceden bilinmesi gerektiğinden neredeyse işe yaramaz hale gelir. Ve söylendiği gibi, bu kadar kolay elde edilemez. Vardiyaları hesaplamak için Olson'ın veritabanını kullanan rastladığım tek kitaplık timezone-JS'dir. Bu kitaplığı kullanmanın sorunu, temeldeki kitaplıkların (tarih / saat seçiciler) onun hakkında hiçbir şey bilmemesi ve standart Tarihi dahili olarak aktif olarak kullanmasıdır. Date nesnesiyle çalışan kitaplıkların geri kalanı bu temele açıkça başvurmaz ve ondan güncelleme almaz. (Yorumlarda beni düzeltin.)

İş uygulamalarında, saat dilimleri yalnızca tarih ve saat belirtilmişse anlamlıdır. Örneğin, çalışma günü saat 9: 00'da başlıyorsa, Vladivostok'taki meslektaşınızın saat 15: 00'te çalışmaya başlamasını pek beklemiyorsunuz. Saat dilimleri dikkate alınmamalı ve bu durumda tarih UTC olarak gösterilmelidir. Bununla birlikte, farklı zaman dilimlerinde aynı anda meydana gelen düzenli olayların olması durumunda, yine de bir saat dilimine ihtiyaç vardır. Örneğin, günlük Scrumınız sizin için 10: 00'da ve Novosibirsk için 13: 00'da başlar. Bu arada, GMT ile UTC arasındaki fark tam olarak bu. UTC, ofseti olmayan zamandır ve GMT, ofset 0 olan zamandır. Bir örnekle açıklayayım:

Moskova saat diliminde 12/31/2014 20:59:59 GMT 12/31/2014 23:59:59 12/31/2014 20:59:59 Moskova saat diliminde UTC 12/31/2014 20:59 gibi görünmelidir : 59
Bu aritmetik nedeniyle çoğunlukla kafaları karışır. Ne yazık ki, bu parametre her yerde karıştırılıyor. JS'de saat diliminin doğrudan gösterilmemesi, yerel bir saat dilimi olarak yorumlanır ve UTC ve GMT'nin gösterimi eşdeğerdir.

Intl. Yapabilirim, ama zorunda değilim. Özellikle böyle bir zaman dilimi parametresi vardır, ancak biraz daha ileri olarak standart şunları tanımlar: Kullanılacak saat dilimi. Gerçekleştirmelerin tanıması gereken tek değer "UTC" dir. Şu anda, Chrome dışında, başka hiçbir tarayıcı rastgele saat dilimlerini desteklemiyor.
JS'deki zaman aralıklarında her şey gerçekten kötü - dilde böyle bir şey yok. İyi yapmak istiyorsan, kendin yap.

Ne yapalım
  • Seçenek 1.
    Rasgele bir saat dilimi kullanmayın. Tercih edilen seçenek ve muhtemelen en acısız. Yani, yalnızca yerel saat dilimine ve UTC'ye sahipsiniz. Bu durumlar için, çok uygun olmasa da, tüm tarayıcılar her şeye sahip görünüyor. Ek olarak, saat dilimi işletim sistemi için global olarak ayarlanır ve belirli bir web uygulaması için bunu değiştirmek koşer değildir.
  • Seçenek 2.
    Rasgele saat dilimlerine ihtiyaç duyulursa, zaman damgası kullanmayın. Kesinlikle. Zaman dilimi ile birlikte RFC satırındaki tasarruf bankasındaki zamanı kaydedin. Tarayıcılar arası bir anlayışta bunun saat dilimi değişikliklerini yenmeye yardımcı olup olmayacağından emin değilim, ancak en azından Chrome bu tür değişikliklerin farkında.
  • 3. Seçenek.
    Durumlar farklıdır ve zaman herhangi bir cihazdan veri tabanına kaydedilir. Yani, bir zaman damgası şeklinde. Çalıştırılacak hiçbir yer yok, saati doğru bir şekilde görüntülemek için aygıtın saat dilimini veya kullanıcının saat dilimini veya her ikisini de bilmeniz ve tüm vardiyaları elden ele hesaplamanız gerekir. Olson üssünü kullanmadan yapamazsın.
  • Bu masalın ahlaki olmalı ama ekleyecek başka bir şeyim yok. ECMA standardının taslaklarında herhangi bir ilerleme görmüyorum, muhtemelen hiç olmayacak.

Bu derste JavaScript Date nesnesini tanıtacak ve onu pratikte nasıl kullanacağınızı öğreneceğiz.

Tarih oluşturma - 4 örnek

JavaScript'te tarih oluşturma, Date nesnesi kullanılarak yapılır. Date nesnesi, zaman eksenindeki bir noktayı temsil eder ve tarihleri \u200b\u200bve saatleri milisaniye hassasiyetinde depolamak için tasarlanmıştır.

JavaScript'te tarih oluşturma örnekleri.

1. Güncel tarih ve saatin oluşturulması.

JavaScript'te güncel tarih ve saati alma işlemi tamamlandı bir Date nesnesi oluşturarak parametreleri belirtmeden:

// geçerli tarih (kullanıcının yerel bilgisayarında Date nesnesinin bir örneğini yaratma sırasındaki tarih ve saat) var now \u003d new Date (); // örneğin, güncel tarihi console.log dosyasına yazdırın (şimdi);

Yalnızca bugünün tarihini dize biçiminde almanız gerekiyorsa, toLocaleDateString yöntemini kullanabilirsiniz:

Var şimdi \u003d new Date (). ToLocaleDateString (); // 19.12.2019

Kullanıcının şimdiki zamanı şu şekilde elde edilebilir:

Var şimdi \u003d new Date (). ToLocaleTimeString (); // 11:02:48 var şimdi \u003d new Date (). ToLocaleTimeString (). Slice (0, -3); // 11:02

Dize formatında tarih ve saat şu şekilde elde edilebilir:

Var şimdi \u003d new Date (). ToLocaleString (); // 19.12.2019, 11:02:48

2. 1 Ocak 1970 00:00:00 UTC'den bu yana Date nesnesine milisaniye sayısını belirterek bir tarih oluşturun.

// 1 yıl (yüksek hızlı değil) \u003d 365 * 24 * 60 * 60 * 1000 \u003d 31536000000 ms // örneğin, 01/01/1971, 00:00:00 UTC: var date1 \u003d new Date (31536000000) tarihini oluşturalım;

3. Bir Date nesnesine dizge olarak belirtilerek bir tarihin oluşturulması.

Bu bir tarih oluşturma seçeneğiyle, JavaScript kendisine aktarılan dizeyi anlamaya çalışır ve ona göre bir tarih oluşturur. JavaScript'te bir dizeyi tarihe dönüştürmek, Date.parse yöntemi kullanılarak yapılır.

Örneğin:

// GG.AA.YY biçimindeki bir dizeye dayalı bir tarih oluşturun var date1 \u003d new Date ("05.11.19"); // YYYY-AA-GGTss: dd: ss.sss biçiminde bir dizeye dayalı bir tarih oluşturun (T tarih ve saati ayırmak için kullanılır) var date2 \u003d new Date ("2015-02-24T21: 23"); // saat dilimini belirten bir dizeye dayalı bir tarih oluşturun (YYYY-AA-GGTss: dd: ss.sss biçiminde ± ss: dd): var date3 \u003d yeni Tarih ("2015-02-24T22: 02 + 03: 00") ;

4. Aşağıdaki parametreleri virgülle ayırarak belirterek bir tarih oluşturma: yıl (4 hane), ay (0'dan itibaren), gün (1..31), saat (0..23), dakika (0..59), saniye (0..59), milisaniye (0. .999). Ayrıca, yalnızca ilk iki parametre gereklidir.

Yalnızca gerekli parametrelerle bir tarih oluşturmaya bir örnek:

// 01.01.2015 tarihini oluştur (belirtilmemiş parametreler varsayılan olarak eşittir: sayı - 01, saat - 00, dakika - 00, saniye - 00, milisaniye - 000). var tarih1 \u003d yeni Tarih (2015.01); // 01.24.2015, 21:23 tarihinde bir tarih oluşturun var date2 \u003d new Date (2015,01,24,21,23);

Not: Tarih ve saati UTC olarak ayarlamanız gerekiyorsa, Date.UTC yöntemini kullanabilirsiniz.

// 1 örnek var date1 \u003d Date.UTC (2015,1,1); var tarih2 \u003d yeni Tarih (tarih1); alert (date2.toUTCString ()); // 2. örnek var newDate \u003d new Date (Date.UTC (2015,1,1)); alert (newDate.toUTCString ());

Ayrı Tarih ve Saat Bileşenlerini Geri Alma

JavaScript, tek tek tarih ve saat bileşenlerini almak için aşağıdaki yöntemleri kullanır:

  • getFullYear () - 4 basamaklı bir yıl döndürür;
  • getMonth () - 0 - 11 arası bir sayı biçiminde ayı döndürür (0 - Ocak, 1 - Şubat, 2 - Mart, ..., 11 - Aralık);
  • getDate () - 1'den 31'e kadar ayın gününü döndürür;
  • getHours () - 0 ile 23 arasındaki saat sayısını döndürür;
  • getMinutes () - 0'dan 59'a kadar olan dakika sayısını döndürür;
  • getSeconds () - 0'dan 59'a kadar olan saniye sayısını döndürür;
  • getMilliseconds () - 0 ile 999 arasındaki milisaniye sayısını döndürür.

Bu yöntemlerin tümü, kullanıcının yerel cihazında ayarlanan saat dilimine göre ayrı tarih ve saat bileşenleri döndürür.

// 11/11/2019 00:00 UTC tarihini oluşturun var newDate \u003d new Date (Date.UTC (2019,11,11)); // kullanıcının cihazındaki yerel saat UTC + 10: 00 ise tarih bileşenlerini alın newDate.getFullYear (); // 2019 newDate.getMonth (); // 10 newDate.getDate (); // 11 newDate.getHours (); // 10 newDate.getMinutes (); // 0 newDate.getSeconds (); // 0 newDate.getMilliseconds (); // 0

Şu anda sahip olduğu zaman aralığına bağlı olarak kullanıcıyı selamlayacağımız bir örnek:

// kullanıcının şu anki zamanını ve bu zamanın bileşenlerini alın var now \u003d new Date (), hour \u003d now.getHours (), minute \u003d now.getMinutes (), second \u003d now.getSeconds (), message \u003d ""; // kullanıcının yerel saatine göre bir selamlama ifadesi tanımlayın if (saat<= 6) { message = "Доброе время суток"; } else if (hour <= 12) { message = "Доброе утро"; } else if (hour <= 18) { message = "Добрый день"; } else { message = "Добрый вечер"; } // выполним форматирование времени с использованием тернарного оператора minute = (minute < 10) ? "0" + minute: minute; second = (second < 10) ? "0" + second: second; hour = (hour < 10) ? "0" + hour: hour; message += ", сейчас " + hour + ":" + minute + ":" + second; // выведем приветствие и время в консоль console.log(message); // Добрый вечер, сейчас 22:50:39

Bu örnekte, saat, üçlü operatör kullanılarak gerekli formatta görüntülenir.

JavaScript, UTC + 0 saat dilimi için ayrı tarih ve saat bileşenlerini almak için bu yöntemler için analoglara sahiptir. Bu yöntemler benzer şekilde adlandırılır, ancak "get" den sonra "UTC" eklenir: getUTCFullYear (), getUTCMonth (), getUTCDate (), getUTCHours (), getUTCMinutes (), getUTCSeconds (), getMilliseconds ().

GetDay () yöntemini kullanarak JavaScript'te haftanın gününü alabilirsiniz.

Bu yöntem 0 ile 6 arasında bir sayı döndürür (0 - Pazar, 1 - Pazartesi, ..., 6 - Cumartesi).

Haftanın gününü sayısaldan dize gösterimine dönüştürdüğümüz bir örnek:

Değişken günler \u003d ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"]; // geçerli tarihi al var şimdi \u003d new Date (); // haftanın gününü console.log'a yazdırın ("Bugün" + günler);

GetTime () yöntemini kullanarak 01/01/1970 00:00:00 UTC'den bu yana JavaScript'te geçen milisaniye sayısını alabilirsiniz.

GetTimezoneOffset () yöntemini kullanarak yerel cihaz saat dilimi ile JavaScript'teki UTC arasındaki farkı (dakika cinsinden) öğrenebilirsiniz.

Ayrı tarih ve saat bileşenlerini ayarlama

JavaScript'te, Date nesnesinde aşağıdaki yöntemleri kullanarak ayrı tarih ve saat bileşenlerini ayarlayabilirsiniz:

  • setFullYear (yıl [, ay, tarih]) - yılı ayarlama (ek olarak başka bir ay ve gün de ayarlayabilirsiniz);
  • setMonth (ay [, tarih]) - ayın 0'dan 11'e ayarlanması (0 - Ocak, 1 - Şubat, 2 - Mart, ..., 11 - Aralık); ek olarak, bu yöntem numarayı ayarlamanıza izin verir;
  • setDate (tarih) - numarayı ayarlama;
  • setHours (saat [, dakika, saniye, ms]) - saati 0'dan 23'e ayarlar (ayrıca dakika, saniye ve milisaniye ayarlayabilirsiniz);
  • setMinutes (min [,) - 0 ile 59 arasındaki dakikaları ayarlar (ek olarak daha fazla saniye ve milisaniye ayarlayabilirsiniz);
  • setSeconds (sec,) - 0'dan 59'a saniyeleri ayarlar (ek olarak, daha fazla milisaniye ayarlayabilirsiniz);
  • setMilliseconds (ms) - Milisaniyeleri (0 ila 999) ayarlar.

Bu yöntemlerin tümü, kullanıcının bilgisayarında ayarlanan saat dilimine göre tarih ve saati ayarlamak için tasarlanmıştır.

// geçerli tarihi içeren bir Date nesnesi örneği oluşturun var newDate \u003d new Date (); // newDate.setFullYear (2019) yılını ayarlayın; // yılı ve ayı ayarlayın newDate.setFullYear (2019, 08); // 20.09.2019 ayarlayın newDate.setFullYear (2019, 08, 20); // newDate.setMonth (05) ayını ayarlayın; // ayı ve günü ayarlayın newDate.setMonth (05, 15); // newDate.setDate (28) sayısını ayarlayın; // newDate.setHours (13) saatini ayarlayın; // saat ve dakikayı ayarlayın newDate.setHours (13,20);

JavaScript'te, tarih ve saati UTC + 0 saat diliminde ayarlamak şu yöntemler kullanılarak yapılır: setUTCFullYear (), setUTCMonth (), setUTCDate (), setUTCHours (), setUTCMinutes (), setUTCSecondes (), setUTCMilliseconds ().

01/01/1970 00:00:00 UTC'den bu yana geçen milisaniye sayısını kullanarak tarih ve saatin ayarlanması ve ardından setTime () kullanılarak yapılır.

Ek olarak, JavaScript'te yanlış tarih ve saat bileşenlerinin belirtilmesi hatalara yol açmaz, bunlar geri kalanı arasında otomatik olarak dağıtılır.

Örneğin:

// 44 sayısı şu şekilde dağıtılacaktır: 44 - 31 \u003d 13, 13 Şubat 2019 newDate.setFullYear (2019, 01, 44);

Bu teknik, belirli bir süre için verilenden farklı bir tarih almanız gerektiğinde kullanılabilir.

// newDate'ten 7 gün daha büyük olacak tarih newDate.setDate (date1.getDate () + 7); // newDate'ten 120 saniye daha az olacak tarih newDate.setSeconds (date1.getSeconds () - 120); // bu şekilde newDate için önceki ayın son gününü ayarlayabilirsiniz newDate.setDate (0);

Bir tarihi bir dizeye dönüştürme ve biçimlendirme

JavaScript'te, bir tarihi dizeye dönüştürme yöntemleri 2 gruba ayrılabilir.

İlk grup, tarayıcıda tanımlandığı şekilde bunu yapan yöntemleri içerir: toString (), toDateString (), toTimeString (), toUTCString ().

ToString () yöntemi tam tarih temsilini, toDateString () - yalnızca tarih, toTimeString () - yalnızca saat, toUTCString () - tam tarih gösterimini, ancak UTC + 0 saat diliminde döndürür.

Çünkü bu yöntemlerin döndürmesi gereken dize gösterimleri standartta açıkça tanımlanmamıştır, farklı tarayıcılarda farklılık gösterebilir.

İkinci gruba yöntemler yerel bilgisayarın saat dilimi ve dili dikkate alınarak atanabilir: toLocaleString () - tarih ve saat, toLocaleDateString () - yalnızca tarih, toLocaleTimeString () - yalnızca saat.

ToLocaleString (), toLocaleDateString (), toLocaleTimeString () yöntemlerinin 2 isteğe bağlı parametresi vardır. İlk parametre yerel ayarı açıkça belirtmek içindir, ikincisi biçimlendirme seçeneklerini belirtmek içindir.

Yerel ayar açıkça belirlenmemiş veya tanımlanmamışsa, tarayıcı varsayılan olarak sahip olduğu yeri alır.

Ek olarak, JavaScript ayrıca bir toISOString () yöntemine sahiptir. ISO biçiminde tarih ve saati içeren bir dize döndürür (YYYY-MM-DDTHH: mm: ss.sssZ).

// 04/15/2019 18:43:59 tarihini oluşturun (kullanıcının saat diliminde) var newDate \u003d new Date (2019, 03, 15, 18, 43, 59); console.log (newDate.toString ()); // 15 Nisan 2019 Pazartesi 18:43:59 GMT + 1000 (Vladivostok Standart Saati) console.log (newDate.toDateString ()); // 15 Nis 2019, Pzt console.log (newDate.toTimeString ()); // 18:43:59 GMT + 1000 (Vladivostok, standart saat) console.log (newDate.toLocaleString ()); // 04/15/2019, 18:43:59 console.log (newDate.toLocaleDateString ()); // 04/15/2019 console.log (newDate.toLocaleTimeString ()); // 18:43:59 console.log (newDate.toUTCString ()); // Pzt, 15 Nisan 2019 08:43:59 GMT console.log (newDate.toISOString ()); // 2019-04-15T08: 43: 59.000Z

Dizeyi tarihe dönüştürme yöntemi

JavaScript, bir dizeyi tarihe dönüştürmek için Date.parse () yöntemini kullanır. Bu yöntem, RFC2822 veya ISO 8601 uyumlu ise bir dizeyi dönüştürebilir.

Bu derste, bir dizenin aşağıdaki biçimde olmasını gerektiren ISO 8601 standardını göz önünde bulundurun: YYYY-AA-GGTsa: dd: ss.sssZ

  • YYYY - 4 basamaklı yıl;
  • MM - 2 basamaklı bir ay (01 \u003d Ocak, 02 \u003d Şubat vb.);
  • DD - 2 basamaktan oluşan ayın günü (01..31);
  • T - tarih ve saati ayırmak için karakter;
  • hh - saat sayısı (00..23);
  • mm - dakika sayısı (00..59);
  • ss - saniye sayısı (00..59);
  • sss - milisaniye sayısı (0..999);
  • Z, saatin UTC biçiminde belirtildiği anlamına gelen bir karakterdir. UTC yerine saat dilimini ayarlamanız gerekiyorsa, "Z" harfi + hh: mm veya -hh.mm değeriyle değiştirilmelidir.

Tarih ve saati içeren dize RFC2822 veya ISO 8601 biçiminde değilse, JavaScript'in Date.parse () yöntemi onu yine de dönüştürebilir, ancak bu durumda sonuç tahmin edilemez olabilir.

Merhaba!
Genellikle istatistiksel verilerle çalışmam gerekiyor ve bunların çoğu tarihlerle ilgili. Ayrıca, sayfada farklı formatlarda aynı tarih kullanılabilir (örneğin, bir araba için uygun ve bir kişi için uygun). Çoğunuzun Date nesnesi kullanımıyla gelen tüm bu korkunç kodun tamamen farkında olduğunuzu düşünüyorum.
Örneğin, güncel tarihi GG.AA.YYYY formatında almak için aşağıdakileri yapmamız gerekir:
var d \u003d new Date (), fd \u003d d.getDate () + "." + (d.getMonth () + 1) + "." + d.getFullYear ();
Ve bu tür çok sayıda satır olduğunda? Javascript'te bir ayın, sadece içinde değil, sıfırdan geliştiğinde başladığını hatırlamak kolay mı? Veya arka uçtaki hemen hemen her yerde olduğu gibi milisaniyelerin olduğu, saniyelerin olmadığı gerçeği mi? Popüler Moment.js kitaplığı ile bazı görevleri çözebilirsiniz, ancak çok yavaş çalışır.
Söz konusu kütüphane bu sorunları çözmektedir.
İlgileniyorsanız, bu küçük incelemeyi okumanızı öneririm.

TempusJS, Date nesnesinde çok fazla sözdizimsel şekerdir, bu nedenle çok hızlıdır. Kitaplığın sözdizimi oldukça basittir. Örneğin, bir önceki örneği şöyle yazabilirsiniz:
var fd \u003d tempus (). format ("% d.% m.% Y");
Şimdi hız hakkında. Spoylerde, Tempus ile Moment ve yerel tarih biçimlendirmesinin bir karşılaştırmasını görebilirsiniz (yukarıya bakın):

Yerel JS, MomentJS ve TempusJS karşılaştırması

Güncel tarihi alıyoruz
Yerel JS x 2.175.575 işlem / sn ±% 0,75 (örneklenmiş 96 çalıştırma) Moment x 284.864 işlem / sn ±% 0,85 (örneklenmiş 96 çalıştırma) Tempus x 2.086.081 işlem / sn ±% 0,73 (örneklenmiş 97 çalıştırma)
Biçimlendirme
Yerel JS x 1.637.517 işlem / sn ±% 0,61 (örneklenmiş 100 çalıştırma) Moment x 8.808 işlem / sn ±% 1,07 (örneklenmiş 100 çalıştırma) Tempus x 942,815 işlem / sn ±% 0,68 (örneklenmiş 94 çalıştırma)
Otomatik tarih algılama ve ayrıştırma
Yerel JS x 11.204.316 işlem / sn ±% 0,81 (örneklenmiş 88 çalıştırma) Moment x 38.511 işlem / sn ±% 1,41 (örneklenmiş 95 çalıştırma) Tempus x 93,973 işlem / sn ±% 1,06 (örneklenmiş 85 çalıştırma)
Bir tarihi biçime göre ayrıştırma
Moment x 46,293 işlem / sn ±% 0,63 (örneklenmiş 100 çalıştırma) Tempus x 109,947 işlem / sn ±% 0,93 (örneklenmiş 99 çalıştırma)
Ayrıştırma ve doğrulama
Moment x 44.588 işlem / sn ±% 1.09 (örneklenmiş 90 çalıştırma) Tempus x 103.439 işlem / sn ±% 0.90 (örneklenmiş 94 çalıştırma)
Sonuçlar dizüstü bilgisayarımda Google Chrome 30.0.1599.114'te elde edildi. Diğer tarayıcılarda sonuçlar farklılık gösterir, ancak oran kabaca aynı kalır.
Testler için benchmark.js kitaplığı kullanıldı
Diğer özellikler için kıyaslamaları görebilirsiniz.

Dolayısıyla bu kütüphanenin avantajları şu şekilde yazılabilir:

  • IE6 +, Chrome, Firefox, Opera'yı destekler;
  • Çağrı zincirlerini destekler;
  • Aylar sıfır yerine 1 (varsayılan) ile başlayabilir;
  • Milisaniyeler devre dışı bırakılabilir (varsayılan) veya etkinleştirilebilir;
  • Hızlı çalışma (Çoğu durumda, uygulaması daha hızlı dillerde yazılan tarayıcının yerel Date nesnesi kullanıldığından);
  • Özel biçimleri ve eklentileri destekler
  • Tarih doğrulaması çok hızlıdır ve yalnızca tarihi ayarlayan işlevlere bağlıdır (çünkü doğrulama, değerler girildiğinde zaten gerçekleşir ve ayrı olarak hesaplanmaz);
  • Kullanıcı dilinin çoklu dil ve otomatik tespiti.

Burada sadece bazı fonksiyonlardan bahsedeceğiz.

Biçimlendirme ve ayrıştırma

Yeni başlayanlar için başka bir tarih biçimlendirme örneği. Burada ayrıca çağrı zincirleme kullanıyoruz. Her ayarın sonunda, zincirin daha aşağısında kullanabileceğimiz bir TempusDate nesnesi alırız. Misal:
tempus (). // hesaplanan yeni tarihi al ((ay: -1)). // bir aylık format azaltın ("% d.% m.% Y"); // Dizge olarak çıktı
Böylece aynı gün, saat ve saniyeyi bir ay önce alıyoruz. Bu, geçen aya ait raporları almak için kullanışlıdır.

Bir sonraki örnek, bir tarihi ayrıştırmaktır.
// "2013-11-18" tarihli bir TempusDate nesnesi döndürür tempus ("11/18/2013"); // "2013-12-12" tarihli bir TempusDate nesnesi döndürür tempus ("2013-12-12", "% Y-% m-% d"));
Tempus, bilinen bazı formatları otomatik olarak algılayabilir. Ayrıca, belirli bir format belirtebilirsiniz, ardından ayrıştırma daha hızlı olacaktır. Ayrıca, ayrıştırma başarısız olursa döndürülecek tarihi de ayarlayabilirsiniz:
// Çünkü "123", "% d.% M.% Y" biçimiyle eşleşmiyor, ardından // 2013-01-01 tarihini içeren bir nesne tempus ("123", "% d.% M.% Y", tempus ());
Varsayılan formatların listesi görüntülenebilir

Şimdi biçimlendirilmiş tarihin formatını değiştirelim
// "2013-11-05" tempus ("05.11.2013"). Biçim ("% Y-% m-% d"); // Öyleyse // "Ekim, 12" tempus ("2013-10-12 12:31:01", "% Y-% m-% d% H:% M:% S"). Biçim ("% B,% d ");

Biçimlendirme için yerelleştirmeyi de kullanabilirsiniz. Varsayılan olarak, kullanıcının dili (tarayıcıdan alınır) veya kullanıcının dili mevcut Tempus dilleri arasında bulunmuyorsa varsayılan dil seçilecektir.
// tempus.lang ("ru") dilini ayarlayın; // Varsayılan olarak // "Kasım 05" tempus (1383609600) .format ("% B,% d") formatını kullanıyoruz;
Şu anda sadece iki dil var - Rusça ve İngilizce, bu yüzden yardımcı olmaktan memnuniyet duyarım.

Doğrulama

Tarih doğrulaması aşağıdaki gibidir:
// Yanlış tempus verir ("08/32/2013", "% d.% M.% Y"). Valid (); // Gerçek tempusu döndürür ("00:00 01.01.2012", "% H:% M% d.% M.% Y"). Valid ();

Bir hata durumunda, değerin yanlış olmadığı her yerde, oluştuğu alanlara bakabilirsiniz:
// Döndürür ("yıl": - 5, "ay": yanlış, "gün": yanlış, "saat": yanlış, // "dakika": yanlış, "saniye": yanlış, "milisaniye": yanlış) tempus (). yıl (-5). // yılı \u003d -5 olarak ayarlayın, yani geçersiz hatalar (); // hatalı nesneyi al

Tarih aralıkları

Bazen yıl sayısını (örneğin yaş), ayları, günleri vb. Almamız gerekir. iki tarih arasında. Bunu yapmak için, iki tarih arasındaki farkı bulan ve istenen formatta ("yıl", "ay", "gün", "saat", "dakika", "saniye", "milisaniye") döndüren between yöntemini kullanabiliriz.
1 Kasım 2013 ile 5 Mayıs 2014 arasındaki ay sayısını elde etmenin basit bir örneğini burada bulabilirsiniz:
// 6 tempus () döndürür. (Tempus (), "month") arasında;
Ya da yeni yıla kaç saat kaldı
tempus (). arasında (tempus (), "saatler");
Son örnekte, sadece yılı belirttiğimi görebilirsiniz. Bir dizi veya nesneye bir değer ayarlarken, eksik değerler
minimumla dolu. Dokümantasyonda minimum değerlere sahip sabitlerin listesini görebilirsiniz.

Ayrıca, calc işlevini kullanarak herhangi bir tarihi değiştirebiliriz:
// 2012-01-01 tarihli bir TempusDate döndürür tempus (). Calc ((yıl: 1, ay: -4, gün: -1));

Özel biçimler

1'den 12'ye kadar değerler alabilen (01'den 12'ye değil) ay için kendi formatımızı uyguluyoruz:
// Yeni bir biçim kaydedin tempus.registerFormat ("% q", // yönerge -% q function (tarih) (// Burada biçimlendirme işlevini, yani% q yerine neyin değiştirileceğini belirtiyoruz dönüş tarihi.month ();) , function (value) (// Ve işte ayrıştırma işlevi var v \u003d Number (value); return (month: (isNaN (v)? undefined: v));), 1, // 2 değerinin alabileceği minimum uzunluk , // Maksimum uzunluk "sayı" // Tür); // Test Ediliyor // "01.1.2013" döndürür; tempus ((yıl: 2013, ay: 1, gün: 1)). format ("% d.% q.% Y"); // Döndürür ("yıl": 2013, "ay": 2, "gün": 10, "saat": 0, "dakika": 0, "saniye": 0); tempus ("10.2.2013", "% d.% q.% Y"). get ();
Kayıt olurken, bazı parametrelerin ayrı ayrı ayarlandığını ve normal bir ifadenin kullanılabileceğini fark edeceksiniz. Aslında, başlangıçta oradaydı, ancak onu terk ettikten sonra hız birkaç düzine arttı.
Bazı formatları kaldırmanız gerekirse, unregisterFormat'ı kullanın:
tempus.unregisterFormat ("% d"); // "% d.01.2013" döndürür çünkü % d yönergesi artık mevcut değil. tempus.format ((yıl: 2013, ay: 1, gün: 1), "% d.% m.% Y");

Getters / Setters

Year (), month (), day (), hours (), minutes (), seconds (), milisaniye (), dayOfWeek (), utc (), timestamp () veya set işlevlerini kullanarak bazı değerleri alabilir / ayarlayabilirsiniz (). Örneğin:
tempus (). // Geçerli tarih yılını (1900) alın. // Olduğu gibi bırakın, ancak 1900 leapYear () olarak ayarlayın; // Artık yıl olup olmadığını kontrol edin, bu durumda false tempus (). Year (); // Ve bu, cari yılı sayısal biçimde almamızın yolu

Tarihler oluşturuluyor

Bir tarihi birçok şekilde oluşturabilirsiniz, parametrelerin tam listesi dokümantasyondadır. İşte minimal bir örnek.
// ["29.03.2013", "30.03.2013", "31.03.2013", "04.01.2013", "04/02/2013"] döndürür; tempus.generate ((dateFrom: "20130329", formatFrom: "% Y.% m.% d", dateTo: "20130402", dönem: (gün: 1), biçim: "% d.% m.% Y" ));
Bu, grafikleri tarihe göre görüntülemek ve görüntüleme biçimini, arka uca talepler olmadan doğrudan istemcide değiştirmek için yararlı olabilir. Tarih, hem bir dizi hem de nesneler olarak oluşturulabilir, burada tarihlerin kendileri anahtar olacaktır (bu, bir olayı bir tarihe bağlamamız gerektiğinde, örneğin kendi takvimimizi oluştururken yararlıdır). Ayrıca tarihler güne, haftaya, aya, saate, yıla göre - ne olursa olsun gruplandırılabilir. Bu aynı zamanda takvime de uygulanabilir.

Eklentiler

Ve son olarak, eklentiler. Burada fabrikayı rastgele bir tarih oluşturacak şekilde genişletiyoruz. Ayrıca, tempus.classes () içinde bulunabilen TempusDate sınıfına ihtiyacımız var. İşte örnek bir eklenti:
(fonksiyon (tempus) (var TempusDate \u003d tempus.classes ("TempusDate"); tempus.randomDate \u003d function () (var date \u003d new TempusDate (); date.year (Math.floor ((Math.random () * ( tempus.MAX_YEAR - tempus.MIN_YEAR)) + tempus.MIN_YEAR)). month (Math.floor ((Math.random () * (tempus.MAX_MONTH - tempus.MIN_MONTH)) + tempus.MIN_MONTH)). day (Math. floor ((Math.random () * (date.dayCount () - tempus.MIN_DAY)) + tempus.MIN_DAY)). saat (Math.floor ((Math.random () * (tempus.MAX_HOURS - tempus.MIN_HOURS) ) + tempus.MIN_HOURS)). dakika (Math.floor ((Math.random () * (tempus.MAX_MINUTES - tempus.MIN_MINUTES)) + tempus.MIN_MINUTES)). seconds (Math.floor ((Math.random () * (tempus.MAX_SECONDS - tempus.MIN_SECONDS)) + tempus.MIN_SECONDS)); dönüş tarihi;);)) (tempus); // Artık tarihleri \u200b\u200başağıdaki gibi oluşturabiliriz var someRandomDate \u003d tempus.randomDate ();
Bu şekilde, bir grup jQuery + Tempus, Angular + Tempus, vb. Kullanarak widget'ları rahatça yazmanın mümkün olacağını düşünüyorum.

Kaynak kodları

Kaynakları github'dan indirerek kurabilirsiniz:
https://github.com/crusat/tempus-js/releases
Veya bower ile:
$ bower tempus yükleme
Sadece bir dosyaya ihtiyacınız var - tempus.js veya tempus.min.js.

Umarım bu kitaplık yararlı olur ve kitaplığı doğru yönde daha da geliştirmek için neyin eksik olduğunu bilmek de ilginç olur. İlginiz için teşekkür ederim!
Not: Davet için teşekkürler!

Geçerli tarih ve saati içeren yeni bir Date nesnesi oluşturmak için yeni Date () kullanın.

Bunu not et Tarih () argüman olmadan çağrılabilir, eşdeğerdir yeni Tarih (Date.now ()) .

Bir tarih nesnesine sahip olduğunuzda, özelliklerini almak için mevcut birkaç yöntemden herhangi birini kullanabilirsiniz (örneğin, 4 basamaklı bir yıl elde etmek için getFullYear ()).

Aşağıda bazı yaygın tarih yöntemleri verilmiştir.

Mevcut yılı alın

var year \u003d (new Date ()). getFullYear (); console.log (yıl); // Örnek çıktı: 2016

İçinde bulunduğunuz ayı alın

var ay \u003d (yeni Tarih ()). getMonth (); console.log (ay); // Örnek çıktı: 0

0 \u003d Ocak olduğunu unutmayın. Bunun nedeni, ayların 0 önce 11 bu nedenle dizine +1 eklemek genellikle tercih edilir.

Geçerli günü alın

var gün \u003d (yeni Tarih ()). getDate (); console.log (gün); // Örnek çıktı: 31

Geçerli saati alın

var saat \u003d (yeni Tarih ()). getHours (); console.log (saat); // Örnek çıktı: 10

Güncel dakikaları alın

var dakika \u003d (yeni Tarih ()). getMinutes (); console.log (dakika); // Örnek çıktı: 39

Mevcut saniyeleri alın

var saniye \u003d (yeni Tarih ()). getSeconds (); console.log (ikinci); // Örnek çıktı: 48

Mevcut milisaniyeleri alın

Bir Date nesnesinin bir örneğinin milisaniyesini (0 ila 999) almak için getMilliseconds yöntemini kullanın.

Değişken milisaniye \u003d (yeni Tarih ()). GetMilliseconds (); console.log (milisaniye); // Çıktı: şu anda milisaniye

Geçerli saati ve tarihi insan tarafından okunabilir bir dizeye dönüştürün

var şimdi \u003d new Date (); // tarihi UTC saat dilimi biçiminde bir dizeye dönüştürün: console.log (now.toUTCString ()); // Çıktı: 21 Haziran 2017 Çarşamba 09:13:01 GMT

Statik Date.now () yöntemi, 1 Ocak 1970 00:00:00 UTC'den bu yana geçen milisaniye sayısını döndürür. Bir Date nesnesi örneğini kullanarak o zamandan beri geçen milisaniye sayısını elde etmek için getTime yöntemini kullanın.

// Date console.log (Date.now ()) için statik yöntemi kullanarak milisaniye alın; // getTime of Date yöntemini kullanarak milisaniye elde edin örnek console.log ((new Date ()). getTime ());