Pure Java – 61 Dates, Numbers & Currency – Date & Calendar

Merhaba Arkadaslar, Java API’si bizim icin date, number , currency gibi konular icin cok cesitli siniflar ve metotlar tanimlamaktadir. OCP 6 sinavinda bu siniflarin ve metotlarin bir kismi sinava dahildir;

  • java.util.Date
  • java.util.Calendar
  • java.text.DateFormat 
  • java.text.NumberFormat 
  • java.util.Locale 

Burada farkli siniflari da yeri geldikce kullanacagiz. Ornegin DateFormat sinifinin alt sinifi olan ; java.text.SimpleDateFormat

Date

java.util.Date sinifinda yer alan bir cok metot deprecated(eskimis/modasi gecmis) durumdadir fakat Calendar ve DateFormat siniflari ile birlikte kullanilmaya devam etmektedir ve hala kullanilan onemli metotlara sahiptir.

import java.util.Date;

public class DateTest {

	public static void main(String[] args) {
		Date date = new Date();

		// Returns the number of milliseconds since January 1, 1970, 00:00:00
		// GMT
		long time = date.getTime();

		System.out.println(time);
		// * @return the difference, measured in milliseconds, between
		// the current time and midnight, January 1, 1970 UTC.
		long now = System.currentTimeMillis();

		System.out.println(now);

		Date date2 = new Date(now);

		System.out.println(date2);

	}
}

getTime() metodu 1 Ocak 1970 00.00.00 tarihinden suana kadar gecenki surenin milisaniye cinsinden degerini dondurur. Benzer bir metot olarak currentTimeMillis() metodudur.

import java.util.Date;

public class CompareDates {

	public static void main(String[] args) {
		Date date1 = new Date();
		Date date2 = new Date();

		int comparison = date1.compareTo(date2);
		System.out.println(comparison);
		// 0 ise iki date/tarih esittir.
		// negatif deger ise 1.date daha eski tarihtir.
		// pozitif deger ise 1.date daha yenidir.
	}
}

getDay, getHour gibi metotlar deprecated olmustur kullanilmasi onerilmez.

Calendar
java.util.Calendar
sinifi tarih/date ile ilgili islemler icin kullanilir. java.util.Date sinifinda deprecated metotlar yerine java.util.Calendar sinifinda yer alan metotlar kullanilir.

Calendar sinifi abstract siniftir, dolayisiyla new anahtar kelimesi ile Calendar sinifindan yeni bir instance/ornek/obje olusturamayiz. Calendar sinifinda overloaded getInstance() metotlari yer almaktadir.

    public static Calendar getInstance()
    {
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
        cal.sharedZone = true;
        return cal;
    }
    public static Calendar getInstance(Locale aLocale)
    {
        Calendar cal = createCalendar(TimeZone.getDefaultRef(), aLocale);
        cal.sharedZone = true;
        return cal;
    }
    public static Calendar getInstance(TimeZone zone)
    {
        return createCalendar(zone, Locale.getDefault(Locale.Category.FORMAT));
    }
    public static Calendar getInstance(TimeZone zone,
                                       Locale aLocale)
    {
        return createCalendar(zone, aLocale);
    }

Dikkat edecek olursak bu metotlarin hepsi createCalendar metodunu cagirmaktadir.

    private static Calendar createCalendar(TimeZone zone,
                                           Locale aLocale)
    {
        Calendar cal = null;

        String caltype = aLocale.getUnicodeLocaleType("ca");
        if (caltype == null) {
            // Calendar type is not specified.
            // If the specified locale is a Thai locale,
            // returns a BuddhistCalendar instance.
            if ("th".equals(aLocale.getLanguage())
                    && ("TH".equals(aLocale.getCountry()))) {
                cal = new BuddhistCalendar(zone, aLocale);
            } else {
                cal = new GregorianCalendar(zone, aLocale);
            }
        } else if (caltype.equals("japanese")) {
            cal = new JapaneseImperialCalendar(zone, aLocale);
        } else if (caltype.equals("buddhist")) {
            cal = new BuddhistCalendar(zone, aLocale);
        } else {
            // Unsupported calendar type.
            // Use Gregorian calendar as a fallback.
            cal = new GregorianCalendar(zone, aLocale);
        }

        return cal;
    }

Genel olarak bu overloaded metotlardan parametre almayan overloaded getInstance() metodu kullaniriz. Bu metot bize GregorianCalendar tipinde bir obje donecektir. Dikkat edecek olursak Java farkli tipteki takvimlere/calendar destek saglamaktadir. GregorianCalendar , Calendar sinifini kalitmaktadir dolayisiyla GregorianCalendar IS A Calendar iliskisi soz konusudur.

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class CalendarUtil {

	public static void main(String[] args) {
		Calendar calendar = Calendar.getInstance();
		System.out.println(calendar instanceof GregorianCalendar);
		System.out.println(calendar);

		Date date = calendar.getTime();
		System.out.println(date);
		// Date objesi olusturabiliriz.
	}
}

getInstance() metodu ile GregorianCalendar tipinde bir objeye sahip oluruz. IS-A kurali geregi Calendar tipindeki bir referans degisken GregorianCalendar tipindeki bir objeyi referans edebilir.

instanceof kontrolunu GregorianCalendar icin yaptigimizda true donecektir.
elde ettigimiz calendar objesini yazdirdigimiz zaman uzun bir cikti elde ederiz;

java.util.GregorianCalendar[time=1414573471563,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Istanbul",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=171,lastRule=java.util.SimpleTimeZone[id=Europe/Istanbul,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2014,MONTH=9,WEEK_OF_YEAR=44,WEEK_OF_MONTH=5,DAY_OF_MONTH=29,DAY_OF_YEAR=302,DAY_OF_WEEK=4,DAY_OF_WEEK_IN_MONTH=5,AM_PM=0,HOUR=11,HOUR_OF_DAY=11,MINUTE=4,SECOND=31,MILLISECOND=563,ZONE_OFFSET=7200000,DST_OFFSET=0]

Calendar sinif get metodu ile yukaridaki bilgilere ulasabiliriz ;
Ornegin calendar objesinden YEAR degerini almak icin  get metodunu su sekilde kullanabiliriz;

 int year = calendar.get(Calendar.YEAR);

Calendar sinifina gidip YEAR degiskeninin degerine baktigimiz zaman ;

 public final static int YEAR = 1;

Burada dikkat edersek YEAR degiskeninin degeri “1” yani yil/year degerine su sekilde de ulasabiliriz ;

int year = calendar.get(1);

Fakat bu sekilde ulasmak yanlis bilgileri almaya neden olabilir. Bunun yerine Calendar.ILGILIDEGER seklinde ulasmak dogru olacaktir. Yoksa 1 degeri YEAR 2 degeri MONTH a karsilik geldigini bir sure sonra unuturuz ve karistiririz. Calendar sinifini incelerseniz bu tarz alanlardan bol miktar yer almaktadir. Kisacasi 1.sekilde kullanmak daha dogru olacaktir.

int month = calendar.get(Calendar.MONTH);

Calendar.MONTH ile de ay bilgisine ulasabiliriz. Burada unutmayalim ocak/january –>0dan baslar. Bu mantigi anladiktan sonra kod icerisindeki aciklamalardan da yararlanip ornegimizi anlayabiliriz ;

import java.util.Calendar;

public class CalendarTest {

	public static void main(String[] args) {

		Calendar calendar = Calendar.getInstance();

		int year = calendar.get(Calendar.YEAR);
		// int year = calendar.get(1);
		// public final static int YEAR = 1;
		// YEAR degiskeni 1 degerine sahiptir .
		// get metoduna 1 veya Calendar.YEAR argumani vermek ayni seydir.

		int month = calendar.get(Calendar.MONTH);
		// hangi ay ? OCAK/JANUARY = 0 baslar ! 1'den baslamaz !

		int daysOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
		// haftanin hangi gunu ? SUNDAY --> 1 dir , burada 0 dan baslamaz !
		// MONDAY-->2 dir ... SATURDAY --> 7 dir

		int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);
		// ayin kacinci gunu (1 den baslar)

		int daysOfYear = calendar.get(Calendar.DAY_OF_YEAR); 
		// yilin kacinci gunu (1 den baslar)

		System.out.println("year:" + year + " month :" + month);
		System.out.println("daysOfWeek:" + daysOfWeek + " daysOfMonth:" + dayOfMonth + " daysOfYear:" + daysOfYear);

		int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH); 
		// ayin kacinci haftasi ? (1den baslar)
		
		int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
		// yilin kacinci haftasi ? (1den baslar)
		System.out.println("weekOfMonth: " + weekOfMonth +" weekOfYear :"+ weekOfYear);

		int hour = calendar.get(Calendar.HOUR); // 12 lik saat
		int hour_of_day = calendar.get(Calendar.HOUR_OF_DAY); //24luk saat
		int minute = calendar.get(Calendar.MINUTE);
		int millisecond = calendar.get(Calendar.MILLISECOND);
			
		System.out.println("hour :" +hour + " hours of day : "+ hour_of_day+" minute:"+minute +" millisecond :"+millisecond);
		
		int zoneOffSet = calendar.get(Calendar.ZONE_OFFSET) ;
		System.out.println(zoneOffSet/(1000*3600));
		// +2 GMT , 7200000 milisaniyedir.
		// 1000 mili saniye 1 saniyedir.
		// 3600 saniye 1 saattir.	
	}
}

getMaximum , getMinimum , getActualMaximum , getActualMinimum gibi metotlari kullanabiliriz. Ozellikle ilgili ayin son gununu bulmak icin faydali olacaktir. (28 29 30 31 ? ) Aciklamalar kod icerisinde yer almaktadir.

import java.util.Calendar;

public class CalendarTest2 {

	public static void main(String[] args) {

		Calendar calendar = Calendar.getInstance();
		int maxDayOfWeek = calendar.getActualMaximum(Calendar.DAY_OF_WEEK);
		// haftanin gunlerinin max degeri 7dir.
		int minDayOfWeek = calendar.getActualMinimum(Calendar.DAY_OF_WEEK);
		// haftanin gunlerinin min degeri 1 dir.
		int maxWeekOfYear = calendar.getActualMaximum(Calendar.WEEK_OF_YEAR);
		int maxWeekOfYear2 = calendar.getMaximum(Calendar.WEEK_OF_YEAR);
		int lastDayOfMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
		// ayin son gununu bu sekilde bulabiliriz.

		System.out.println(maxDayOfWeek);
		System.out.println(minDayOfWeek);
		System.out.println(maxWeekOfYear);
		System.out.println(maxWeekOfYear2);
		// 52.hafta 28 Aralik ta bitmektedir.
		// 1.hafta 29 30 31 aralik seklinde devam etmektedir. Bu nedenle
		// getMaximum 53 donecektir.
		System.out.println(lastDayOfMonth);

	}
}

NOT:  Bu yaziyi insallah tekrar guncelleyecegim diger konularin devam etmesi icin simdilik burada sonlandiriyorum. Soyleceklerim henuz bitmedi.

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *