PART 13 13. Tarih & Zaman Java, java.util paketi içinde mevcut olan Date sınıfını sağlar, bu sınıf güncel tarih ve zamanı kapsüllemektedir. Date sınıfı 2 adet constructor destekler. İlk constructor, güncel tarih ve zaman ile nesneye ilk değerini atar. Date( ) Aşağıdaki constructor, 1 Ocak 1970 gece yarısından bu yana geçen milisaniye sayısına eşit bir bağımsız değişken kabul etmektedir. Date(long millisec) Bir kere mevcut Date nesnesine sahipseniz, tarihlerle oynamak için aşağıda desteklenen metotlardan herhangi birini çağırabilirsiniz. Methods with Description boolean after(Date date) Date nesnesi çağrılırken belirtilen tarihten sonra bir tarih içeriyorsa, true değeri döndürür, aksi halde false değeri döndür. boolean before(Date date) Date nesnesi çağrılırken belirtilen tarihten önce bir tarih içeriyorsa, true değeri döndürür, aksi halde false değeri döndür. int compareTo(Date date) Çağrılan nesnenin değeri ile bu tarihi karşılaştırır. Değerler eşit ise , 0 döndürür. Çağrılan nesne tarihten daha önce iste negatif değer döndürür. Çağrılan nesne tarihten daha sonra ise pozitif değer döndürür. boolean equals(Object date) Date nesnesi çağrılırken belirtilen tarihe eşit bir tarih ve zaman içeriyorsa, true değeri döndürür, aksi halde false değeri döndür. String toString( ) Çağrılan Date nesnesini string türüne çevirir ve değeri döndürür. 13.1 Güncel Tarih ve Zamanı Alma Javada, güncel tarih ve zamanı alma çok kolaydır. Aşağıdaki gibi güncel tarih ve zamanı yazdırmak için basit bir Date nesnesini toString() metodu ile kullanabilirsiniz. import java.util.Date; public class DateDemo { public static void main(String args[]) { // Instantiate a Date object Date date = new Date(); // display time and date using toString() System.out.println(date.toString()); } } Bu aşağıdaki sonucu üretecektir: Mon May 04 09:51:52 CDT 2012 13.2 Tarih Karşılaştırma 2 farklı tarihi karşılaştırmak için iki adet yöntem vardır. 1. before(), after() ve equals() metolarını kullanabilirsiniz. 2. compareTo() metodunu kullanabilirsiniz. Örnek: import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { Date d1 = new Date(); SimpleDateFormat ft1 = new SimpleDateFormat ("yyyy.MM.dd hh:mm:ss"); ft1.format(d1); Date d2 = new Date( ); SimpleDateFormat ft2 = new SimpleDateFormat ("2012.11.dd hh:mm:ss"); ft2.format(d2); System.out.println("D1: " + ft1.format(d1) ); System.out.println("D2: " + ft2.format(d2) ); System.out.println(d1.after(d2)); System.out.println(d1.before(d2)); System.out.println(d1.compareTo(d2)); System.out.println(d1.equals(d2)); } } Bu aşağıdaki sonucu üretecektir: D1: 2013.03.10 10:38:12 D2: 2012.11.10 10:38:12 false true -1 false 13.3 Tarih Biçimlendirme (SimpleDateFormat) SimpleDateFormat, yerele duyarlı bir şekilde tarihleri biçimlendirmek ve öğelerine ayırmak için kullanılan somut bir sınıftır. SimpleDateFormat, tarih-zaman biçimlendirme için herhangi kullanıcı tanımlı bir kalıp seçerek başlatmanıza izin verir. import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { Date dNow = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("yyyy.MM.dd hh:mm:ss"); System.out.println("Current Date: " + ft.format(dNow)); } } Bu aşağıdaki sonucu üretecektir: Current Date: 2013.03.10 10:13:46 SimpleDateFormat biçimlendirme kodları Zaman biçimini belirtmek için ,time pattern string kullanın. Bu kalıpta, bütün ASCII karakterleri, kalıp karakterleri olarak ayrılmıştır. Aşağıdaki tabloda gösterilmektedir: Karakter Tanımlama Örnek G Çağ göstergesi AD y Dört basamaklı yıllar 2001 M Yılın ayı July or 07 d Ayın günü 10 h Saat A.M./P.M. türünde (1~12) 12 H Saat (0~23) 22 m Dakika 30 s Saniye 55 S Milisaniye 234 E Haftanın günü Tuesday D Yılın günü 360 F Ay içinde haftanın günü 2 (second Wed. in July) w Yılın haftası 40 W Ayın haftası 1 a A.M./P.M. işaretcisi PM k Günün saati (1~24) 24 K Saat A.M./P.M. türünde (0~11) 10 z Saat dilimi Eastern Standard Time ' Metin için kaçış Delimiter " Tek tırnak ` 13.4 Tarihleri Stringlere Ayrıştırma SimpleDateFormat sınıfı bazı ek metotlara sahiptir, özellikle parse(), bu metot SimpleDateFormat nesnesi içinde depolanmış biçime göre string’i ayrıştırır. Örnek: import java.util.*; import java.text.*; public class DateDemo { public static void main(String args[]) { SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); String input = args.length == 0 ? "1818-11-11" : args[0]; System.out.print(input + " Parses as "); Date t; try { t = ft.parse(input); System.out.println(t); } catch (ParseException e) { System.out.println("Unparseable using " + ft); } } } A sample run of the above program would produce following result: $ java –jar DateDemo.jar 1818-11-11 Parses as Wed Nov 11 00:00:00 GMT 1818 $ java –jar DateDemo.jar 2007-12-01 2007-12-01 Parses as Sat Dec 01 00:00:00 GMT 2007 13.5 Kısa Süreli Uyku Bir milisaniyeden bilgisayarınızın yaşam süresine kadar herhangi bir süre sleep yapabilirsiniz. Bu örnekte, program 3 saniye sleep yapmaktadır. import java.util.*; public class SleepDemo { public static void main(String args[]) { try { Date start = new Date(); System.out.println(start.toString() + "\n"); Thread.sleep(3000); Date stop = new Date(); System.out.println(stop.toString() + "\n"); } catch (Exception e) { System.out.println("Got an exception!"); } } } Bu aşağıdaki sonucu üretecektir: Sun May 03 18:04:41 GMT 2012 Sun May 03 18:04:44 GMT 2012 13.6 Geçen Zamanı Ölçme Bazen zaman içinde bir noktayı milisaniye cinsinde ölçmeniz gerekebilir. O halde, yukarıdaki örneği bir kere daha yazalım: import java.util.*; public class DiffDemo { public static void main(String args[]) { try { long start = System.currentTimeMillis( ); Date startdate = new Date(); System.out.println(startdate.toString() + "\n"); Thread.sleep(3000); long end = System.currentTimeMillis(); Date stopdate = new Date(); System.out.println(stopdate.toString() + "\n"); long diff = end - start; System.out.println("Difference is : " + diff); } catch (Exception e) { System.out.println("Got an exception!"); } } } Bu aşağıdaki sonucu üretecektir: Sun May 03 18:16:51 GMT 2012 Sun May 03 18:16:54 GMT 2012 Difference is : 3010 PART 14 14. Düzenli İfadeler Java, düzenli ifadeler ile kalıp eşleşmesi için java.util.regex paketini sağlar. Java düzenli ifadeleri, Perl programlama dili ile çok benzerdir ve öğrenmesi kolaydır. Bir düzenli ifade, desen içinde tutulan özelleştirilmiş bir syntax kullanılarak, diğer stringleri ve string kümelerini eşleştirmeye veya bulmanıza yarayan bir özel karakter dizisidir. Metin ve veriyi aramak, düzenlemek veya değiştirmek için kullanılırlar. Java.util.regex paketi başlıca ,aşağıdaki üç sınıftan oluşur. Pattern Sınıfı: Bir pattern nesnesi, düzenli ifadenin derlenmiş gösterimidir. Pattern sınıfı, public constructor sağlamaz. Kalıp oluşturmak için, öncelikle onun public static derleme metotlarını çağırmanız gerekmektir, bu bir Pattern nesnesi döndürecektir. Bu metotlar , düzenli ifadeyi ilk bağımsız değişken olarak kabul eder. Matcher Sınıfı: Bir eşleştirici nesnesi, deseni yorumlayan ve bir input string’ine karşı eşleştirme işlemlerini gerçekleştiren bir motordur. Pattern sınıfı gibi, Matcher sınıfı da public constructor tanımlamaz. Bir Pattern nesnesi üzerinden matcher metodunu çağırarak bir Matcher nesnesi elde edebilirsiniz. PatternSyntaxException: Bir PatternSyntaxException nesnesi, düzenli ifade desenindeki syntax hatasını gösteren denetimsiz bir exceptiondır. Örnek Aşağıdaki örnek verilen stringten e-mail stringlerinin nasıl bulunacağını anlatmaktadır: import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public static void main( String args[] ){ // String to be scanned to find the pattern. String line = " Benim mailim maltepe@maltepe.edu.tr Bu ise arkadaşımın maili aa@aa.com şeklindedir."; String pattern = " \\b[\\w.%-]+@[-.\\w]+\\.[A-Za-z]{2,4}\\b"; // Create a Pattern object Pattern r = Pattern.compile(pattern); // Now create matcher object. Matcher m = r.matcher(line); while (m.find( )) { System.out.println("Found:" + m.group() ); } } } Bu aşağıdaki sonucu üretecekir: Found: maltepe@maltepe.edu.tr Found: aa@aa.com Group index değerini kullanmak için // Now create matcher object. Matcher m = r.matcher(line); m.find(); System.out.println("Found 0:" + m.group(0) ); Yukarıda verilmiş kod parçası, sadece ilk bulunmuş string’i gösterecektir. 14.1 Düzenli İfadelerin yazım biçimi Buradaki tablo, Java dilinde mevcut bütün düzenli ifade metakarakter syntax’ını listelemektedir. Subexpression Matches ^ Satır başlangıcını eşleştirir. $ Satır sonunu eşleştirir. . Yeni satır hariç herhangi bir tekil karakterini eşleştirir. M seçeneğini kullanmakta yeni satırı eşleştirmeyi sağlar. [...] Köşeli parantez içinde herhangi bir tekil karakterini eşleştirir. [^...] Köşeli parantez olmayan herhangi bir tekil karakterini eşleştirir. \A Bütün string’in başlangıcı \z Bütün string’in sonu \Z İzin verilen son satır sonlandırıcı hariç bütün string’in sonu re* Önceki ifadenin 0 veya daha fazla olayını eşleştirilir. re+ Önceki şeyin 1 veya daha fazlasını eşleştirir. re? Önceki ifadenin 0 veya 1 olayını eşleştirir. re{ n} Önceki ifadenin n sayıda olayını eşleştirir. re{ n,} Önceki ifadenin n veya daha fazla olayını eşleştirir. re{ n, m} . Önceki ifadenin en az n ve en fazla m olayını eşleştirir. a| b A veya B den birini eşleştirir. (re) Düzenli ifadeleri gruplar ve eşlenmiş metni hatırlar. (?: re) Düzenli ifadeyi, eşlenmiş metni hatırlamadan gruplar. (?> re) Bağımsız deseni geileme yapmadan eşleştirir. \w Kelime karakterlerini eşleştirir. \W Kelime olmayan karakterleri eşleştirir. \s Alfabe dışı karakteri eşleştirir. [\t\n\r\f] eşdeğer. \S Matches nonwhitespace. Alfabe dışı olmayan karakteri eşleştirir.. \d Basamak eşleştirir. [0-9] eşdeğer \D Sayı olmayanı eşleştirir. \A String başlangıcını eşleştirir. \Z String sonunu eşleştirir. Eğer yeni satır varsa, yeni satırdan hemen öncekini eşleştirir. \z String sonunu eşleştirir. \G Son eşleşmenin bittiği noktayı eşler \n Grup numarası “n” olan back to reference yakalar \b Köşeli parantezin dışındaki kelime sınırlarını eşleştirir. Köşeli parantezin içindeki geri (backspace (0x08)) karakterlerini eşleştirir. \B Kelime olmayan sınırları eşler. \n, \t, etc. Yeni satırları,carriage returnleri,tabları eşler \Q \E ye kadar olan kaçış karakterleri \E \Q ile başlamış alıntıyı bitirir.