Bu konuda yeni bir gömülmüŠobje olan Date anlatılacaktır. Bu obje tarihi ve saati tutar ve tarih/saat yönetimini üstlenir.
ÃrneÄin, bu objeyi sadece saati saklama, modifiye etme için kullanabilirsiniz, veya zaman ölçümü için veya o anki zamanı göstermek için
Yaratma
Yeni bir Date objesi yaratmak için new Date() aÅaÄıdaki argümanların biri ile çaÄrılabilir.
new Date()-
Argümansız â yeni o anki tarih ve saat ile yeni bir
Dateobjesi oluÅturur:let now = new Date(); alert( now ); // o anki tarih/saati gösterir. new Date(milisaniye)-
1 Ocak 1970 UCT+0âdan sonra geçen milisaniye(1/1000) ile tarih oluÅturulmasıdır
// `0` 01.01.1970 UTC+0 demektir. let Jan01_1970 = new Date(0); alert( Jan01_1970 ); // Buna 24 saat eklemek için, get 02.01.1970 UTC+0 let Jan02_1970 = new Date(24 * 3600 * 1000); alert( Jan02_1970 );1 ocak 1970âden buyana geçen milisaniyeye timestamp ( zaman damgası ) denir.
Bu tarihin en basit biçimde gösterimidir. Her türlü bu zaman damgasından yeni bir tarih oluÅturmak mümkündür. Veya yine herhangi bir tarihten bu zaman damgasını
date.getTime()ile almak mümkündür. new Date(tarih_metni)-
EÄer bir argüman var ve bu da karakter dizisi ise,
Date.parsealgoritmasına göre bakılır ve uygunsa tarih oluÅturulur.let date = new Date("2017-01-26"); alert(date); // Thu Jan 26 2017 ... new Date(yıl, ay, gün, saat, dakika, saniye, milisaniye)-
Yerel zamanda
Dateobjesi oluÅturmak için sadece ilk iki argüman zorunludur.Not:
yıl4 basamaktan oluÅmalıdır.2013olur,98olmaz.aysıfırdan baÅlar. Yani0Ocak,11Aralıktır.günparametresi girilmez ise1olarak kabul edilir.saat/dakika/saniye/milisaniyedeÄerleri girilmez ise0olarak kabul edilir.
ÃrneÄin:
new Date(2011, 0, 1, 0, 0, 0, 0); // // 1 Jan 2011, 00:00:00 new Date(2011, 0, 1); // DiÄer deÄerler veirlmediÄi halde yine aynı sonuç alınacaktır.En düÅün hassasiyet 1msâdir(1/1000)
let date = new Date(2011, 0, 1, 2, 3, 4, 567); alert( date ); // 1.01.2011, 02:03:04.567
Tarih bileÅenlerine eriÅim
Date objesinde yıla, aya vs. eriÅim için birçok metod bulunmaktadır. Fakat bunlar kaegorilere ayrılırsa hatırlanması daha kolay olacaktır.
- getFullYear()
- Yılı döner (4 basamaklı)
- getMonth()
- Ayı döner, 0-11 arasında.
- getDate()
- Ayın gününü döner, 1-31 arasındadır. İsmi aklınızı karıÅtırabilir.
- getHours(), getMinutes(), getSeconds(), getMilliseconds()
- Sırası ile
saat,dakika,saniyevemilisaniyebilgilerini döner.
getYear() deÄil getFullYear()ÃoÄu JavaScript motoru standart olmayan getYear() metodunu entegre etmiÅlerdir. Bu metod kullanımdan kaldırılmıÅtır. Bazen iki basamaklı yılı dönerler. Bu metodu kullanmayın!. Bunun yerine getFullYear() metodunu kullanabilirsiniz.
Bunlara ek olarak haftanın hangi günü olduÄu bilgisi de alınabilir:
- getDay()
- Haftanın gününü, Pazar
0, Pazartesi6olacak Åekilde alır. İlk gün her zaman pazardır. Bazı ülkelerde pazar resmi olarak ilk gün olmasa bile bu fonksiyon pazarı yine de ilk gün olarak alır.
Yukarıdaki tüm metodlar deÄerlerini yerel saate göre dönerler.
Bunun uluslararası saat için eÅleri mevcuttur(UTC). Bu metodlar gün, ay, yıl vs deÄerlerini UTC+0âa göre dönerler:
There are also their UTC-counterparts, that return day, month, year and so on for the time zone UTC+0: getUTCFullYear(),getUTCMonth(), getUTCDay(). "get"'ten sonra "UTC" ekleyerek metodlara ulaÅmak mümkündür.
EÄer bulunduÄunuz saat dilimi UTC+0 dan farklıysa getHours() ve getUTCHours() arasında bir farklılık olacaktır.
// o anki yerel tarih
let date = new Date();
// yerel saat
alert( date.getHours() );
// UTC+0'daki yerel saat( Londra kıŠsaati)
alert( date.getUTCHours() );
Belirtilen metodlar dıÅında, UTC tipi olmayan iki tane özel metod bulunmaktadır:
- getTime()
-
Verilen tarihin zaman damgasını ( timestamp ) döndürür â 1 Ocak 1970 UTC+0âdan itibaren geçen milisaniye
- getTimezoneOffset()
-
Yerel zaman ile UTC arasındaki farkı dakika olarak döndürür:
// EÄer UTC-1'de yaÅıyorsanız, çıktısı 60 // EÄer UTC+3'de yaÅıyorsanız, çıktısı -180 alert( new Date().getTimezoneOffset() );
Tarih bileÅeninin ayarlama
AÅaÄıdaki metodlar tarih bileÅenlerini ayarlamaya yarar:
setFullYear(year [, month, date])setMonth(month [, date])setDate(date)setHours(hour [, min, sec, ms])setMinutes(min [, sec, ms])setSeconds(sec [, ms])setMilliseconds(ms)setTime(milliseconds)(sets the whole date by milliseconds since 01.01.1970 UTC)
setTime() haricinde hepsinin UTC tipi de vardır, örneÄin: setUTCHours()
GördüÄünüz gibi,setHours gibi bazı metodlar birden fazla bileÅeni aynı anda ayarlamaya yarar. Bahsi geçmeyen bileÅenlerde bir deÄiÅiklik yapılmaz.
ÃrneÄin:
let today = new Date();
today.setHours(0);
alert(today); // bugün ve saat 0
today.setHours(0, 0, 0, 0);
alert(today); // bugün ve saniye 00:00:00.
Otomatik Düzenleme
Otomatik düzenleme Date objesinin oldukça kullanıÅlı bir özelliÄidir. Tarihi sınırın dıÅında ayarladıÄınız durumlarda otomatik olarak kendini düzeltebilir.
ÃrneÄin:
let date = new Date(2013, 0, 32); // 32 Ocak 2013 ?!?
alert(date); // ...is 1st Åubat 2013!
Sınırın dıÅındaki tarih bileÅenleri otomatik olarak daÄıtılır.
Ayların sınırlarını düÅünmenize gerek yoktur. Bunlar Date objesi tarafından otomatik olarak hesaplanacaktır.
Diyelim ki â28 Åub 2016â'yı iki gün artırmak istediniz. Belki â2 Martâ belki de â1 Martâ olabilir. Bunu bizim düÅünmemize gerek yoktur. Sadece iki gün ekleyin yeterli. Date objesi geri kalanı sizin için yapacaktır:
let date = new Date(2016, 1, 28);
date.setDate(date.getDate() + 2);
alert( date ); // 1 Mar 2016
Bu özellik belirtilen bir süre sonrasında tekrardan tarihi almak için kullanılır. ÃrneÄin âÅu andan 70 sn sonrasıâ'ni al.
let date = new Date();
date.setSeconds(tarih.getSeconds() + 70);
alert( date ); // doÄru tarihi gösterir.
Sıfır veya negatif deÄer de ayarlamak mümkündür. ÃrneÄin:
let date = new Date(2016, 0, 2); // 2 Ocak 2016
date.setDate(1); // ayın 1. günü
alert( date );
date.setDate(0); // İlk gün 1 olduÄundan dolayı 0 geçen ayın son gününü verir. min day is 1, so the last day of the previous month is assumed
alert( date ); // 31 Aralık 2015
Tarihten sayıya, tarih farklılıÄı
Date objesi sayıya çevrildiÄinde, aynı timestampâte olduÄu gibi date.getTime() deÄerini alır:
let date = new Date();
alert(+date); // date.getTime() ile aynı Åekilde milisaniye döner.
Ãnemli not: tarihler birbirinden çıkarılabilir fakat sonuç ms cinsinden olur.
Bu iki tarih arasındaki zamanı ölçmek için kullanılabilir:
let start = new Date(); // saymaya baÅla!
// iÅi yap
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = new Date(); // bitt
alert( `Döngü ${end - start} ms` );
Date.now()
EÄer sadece zaman farkını ölçmek istiyorsanız, Date objesine ihtiyacınız yok.
Bunun için Date.now() adında bir obje bulunmakta.
Mantık olarak new Date().getTime() ile aynı olmasına raÄmen yeni bir Date objesi oluÅturmamaktadır. Bundan dolayı çok hızlı ve garbage collectionâa yük bindirmemiÅ olur.
Genelde kullanıÅlı olduÄundan veya performans özel JavaScript oyunları gibi uygulamalarda kullanılır.
AÅaÄıdaki daha iyidir denebilir:
let start = Date.now(); // 1 Ocak 1970'den Åimdiye kadar olan zamanın ms cinsinden deÄeri
// iÅi yap
for (let i = 0; i < 100000; i++) {
let doSomething = i * i * i;
}
let end = Date.now(); // done
alert( `Döngü ${end - start} ms sürdür` ); // sadece sayılar çıkarıldı tarihler deÄil.
Kıyaslama
EÄer çok aÄır yüklü iÅlemler için kıyaslama yapılıyorsa, dikkatli olunmalıdır.
ÃrneÄin, iki tarih arasındaki farkı hesaplayan iki fonksiyondan hangisinin daha hızlı olduÄunu inceleyelim
// tarih1 ve tarih2, hangisi iÅlemi daha hızlı tamamlar.
function diffSubtract(date1, date2) {
return date2 - date1;
}
// veya
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
Yukarıdaki iki fonksiyon aynı iÅlemi yapar, fakat bir tanesi date.getTime() ile o tarihin ms cinsinden deÄerini alırken diÄeri tarihin sayıya doÄrudan çevrilmesine dayalı. Sonuçları her zaman aynı olacaktır.
Ãyleyse hangisi daha hızlı?
Bunu ölçmek için fonksiyonları birçok defa çalıÅtırıp aradaki farkı öyle kontrol etmektir.
Ãlçülecek olursa:
function diffSubtract(date1, date2) {
return date2 - date1;
}
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
function bench(f) {
let date1 = new Date(0);
let date2 = new Date();
let start = Date.now();
for (let i = 0; i < 100000; i++) f(date1, date2);
return Date.now() - start;
}
alert( 'Time of diffSubtract: ' + bench(diffSubtract) + 'ms' );
alert( 'Time of diffGetTime: ' + bench(diffGetTime) + 'ms' );
Vay be! getTime() ile yapılan iÅlem çok daha hızlı! Bunun nedeni tip dönüÅümü olmaması, böylece JavaScript motoru çok daha iyi optimize edebilmektedir.
Bir deÄer aldık fakat bu henüz iyi bir karÅılaÅtırma olmadı.
Diyelim ki karsilastirma(cikarma) çalıÅırken iÅlemci paralelde baÅka bir Åeyler ile uÄraÅıyor olsun. Bu uÄraÅtıÄı iÅlemler karsilastirma(tarihFarki) zamanında bitsin.
Bu aslında oldukça gerçekçi bir senaryodur.
A pretty real scenario for a modern multi-process OS.
Sonuç olarak karsilastirma(cikarma) için daha az iÅlemci kaynaÄı kullanılanılır ve bu da yanlıŠsonuca neden olur.
Daha güvenilir karÅılaÅtırma yapabilmek için bu karÅılaÅtırma paketi bir kaç defa çalıÅtırılmalıdır
AÅaÄıda örneÄini görebilirsiniz:
function diffSubtract(date1, date2) {
return date2 - date1;
}
function diffGetTime(date1, date2) {
return date2.getTime() - date1.getTime();
}
function bench(f) {
let date1 = new Date(0);
let date2 = new Date();
let start = Date.now();
for (let i = 0; i < 100000; i++) f(date1, date2);
return Date.now() - start;
}
let time1 = 0;
let time2 = 0;
// Paketi 10 defa çalıÅacak Åekilde ayarlayın
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
alert( 'Total time for diffSubtract: ' + time1 );
alert( 'Total time for diffGetTime: ' + time2 );
Modern JavaScript motorları âsıcak kodâ için daha geliÅmiÅ optimizasyon yapmaya baÅladılar. Bu nadiren çalıÅan kodlar yerine daha çok fazlaca tekrar eden kodların optimizasyonu anlamına gelmektedir. Böylece ilk çalıÅmalar çok ta optimize edilmezler.
// ana döngüye girmeden ısınma turu:
bench(diffSubtract);
bench(diffGetTime);
// Åimdi ise karÅılaÅtırma ( benchmark )
for (let i = 0; i < 10; i++) {
time1 += bench(diffSubtract);
time2 += bench(diffGetTime);
}
Modern JavaScript motorları kod üzerinde birçok iyileÅtirme yaparlar. Normal kullanımdan ziyade yapay test sonuçları üzerinde deÄiÅikliklere neden olabilirler. Ãzellikle çok küçük karÅılaÅtırmalarda. Bundan dolayı eÄer performan sizin için çok ciddi bir konu ise, JavaScript motorlarının nasıl çalıÅtıÄını öÄrenmeniz gerekmektedir. ÃÄrendiÄinizde mikro seviyede bir karÅılaÅtırmaya ihtiyacınız kalmayacaktır.
V8 motoru ile ilgili makaleleri http://mrale.ph adresinden bulabilirsiniz.
Karakter dizisinden Date.parse ile tarih alma.
Date.parse(str) metodu karakterden tarih ayrıÅtırmaya yarar.
Metin formatı: YYYY-MM-DDTHH:mm:ss.sssZ Åeklindedir, burada :
YYYY-MM-DDâ tarih : yıl-ay-gün"T"karakteri ayraç.HH:mm:ss.sssâ zaman: saat:dakika:saniye.sarise Åeklindedir.- İsteÄe baÄlı olarak eklenen
'Z'+-hh:mmÅeklinde UTCâye göre zaman ayarlamaya yarar. VarsayılanZdeÄeri UTC+0 anlamına gelir.
Daha kısa YYYY-MM-DD veya YYYY-MM hatta YYYY gibi Åeklinde bile olabilir.
Date.parse(str) çaÄrısı verilen formatta karakterleri alır ve timestamp( 1 Ocak 1970 UTC+0âdan itibaren geçen sarise ) olarak geri döner. EÄer format doÄru deÄilse, NaN döner.
ÃrneÄin:
let ms = Date.parse('2012-01-26T13:51:50.417-07:00');
alert(ms); // 1327611110417 (timestamp)
Zaman damgasından (timestamp) new Date objesi yaratılabilir.
let date = new Date( Date.parse('2012-01-26T13:51:50.417-07:00') );
alert(date);
Ãzet
- Tarih ve saat bilgisi JavaScriptâte Date objesiyle temsil edilir. Sadece tarih veya saadece saat bilgisiyle obje oluÅturulamaz:
Dateobjesi her zaman iki bilgiyi de taÅır. - Aylar 0âdan baÅlar. (Evet, Ocak ayı 0. aydır)
- Haftanın günü
getDate()de 0âdan baÅlar (Pazar günü) Dateobjesi eÄer belirttiÄiniz tarih mevcut deÄilse bunu hesaplayabilir. Bu; gün, saat, ay ekleme/çıkarmak için kullanıÅlı bir özelliktir.- Tarihler çıkartılabilir, aradaki fark sarise olarak döndürülür. Bunun nedeni
Datesayıya çevrildiÄinde zaman damgası olur. - O anki zaman damgasını (timestamp) almak için
Date.now()kullanabilirsiniz.
DiÄer sistemlerin aksine, zaman damgası javascripte saniye deÄil sarise cinsindendir.
EÄer daha ayrıntılı zaman bilgisine eriÅmek istiyorsanız. JavaScript desteklemese bile çoÄu sistem microsaniyeye destek verir ( saniyenin milyonda biri ). ÃrneÄin performance.now() sayfanın yüklenme süresini mikrosaniye cinsinden verir.
alert(`Loading started ${performance.now()}ms ago`);
// Sonuç : Yüklemeye 4731.26000000001ms önce baÅladı
// .26 mikrosaniye (260 mikrosaniye)
// noktanın 3. basamaÄından sonraki deÄerler sapmadır fakat ilk 3 basamak doÄrudur.
Node.JS microtime modülüne sahiptir. Teknik olarak her cihaz daha hassas tarih bilgisine ulaÅabilir, sadece Date objesinde bu bilgiler yer almaz.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)