🗓️ Java Tarih Formatlama Rehberi: SimpleDateFormat ve DateFormat Kullanımı
Java’da tarih ve saat işlemleri, kullanıcıya uygun biçimde veri sunmak için kritik öneme sahiptir.
Bu rehberde DateFormat ve SimpleDateFormat sınıflarını detaylıca öğrenecek, farklı bölgesel ayarlarda (Locale) tarih/saat formatlamayı adım adım göreceksiniz.
💡 Bu Rehberde Ne Öğreneceksiniz
- DateFormat ve SimpleDateFormat arasındaki fark
- Özel tarih/saat kalıpları (patterns) oluşturma
- Bölgesel (Locale) formatlama örnekleri
format()veparse()metotlarının kullanımı- Thread-safety uyarıları ve modern
java.timealternatifi
🧠 Aşama 1 – Konunun Temeli
Ana teknik konu: Java’da tarih/saat biçimlendirme (formatting) ve çözümleme (parsing).
Çözdüğü problem: Date nesnelerini istenen formata dönüştürür veya metin formatındaki tarihleri Date nesnesine çevirir.
Teknik özet: Bu API, Locale farklarını yönetir, tarihi kullanıcıya uygun biçimde gösterir. Ancak thread-safe değildir.
📅 1. DateFormat ile Bölgesel Formatlama
DateFormat, belirtilen Locale (bölgesel ayar) değerine göre tarihleri biçimlendirir.
Örneğin ABD’de tarih 12/31/2025 iken, Türkiye’de 31.12.2025 olarak görünür.
🔧 Örnek: Tarih Formatlama
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
Locale yerelAyar = new Locale.Builder().setLanguage("tr").setRegion("TR").build();
DateFormat tarihFormat = DateFormat.getDateInstance(DateFormat.DEFAULT, yerelAyar);
String tarih = tarihFormat.format(new Date());
System.out.println(tarih);
💬 Bu kod, Türkiye yerel ayarına göre tarih formatlar.
Çıktı: 26 Eki 2025
⏰ Örnek: Sadece Zaman Formatlama
DateFormat zamanFormat = DateFormat.getTimeInstance(DateFormat.DEFAULT, yerelAyar);
String zaman = zamanFormat.format(new Date());
System.out.println(zaman);
💬 Zamanı bölgesel formata göre gösterir.
Çıktı: 22:53:01
📝 2. SimpleDateFormat ile Özel Kalıplar
SimpleDateFormat, DateFormat’tan farklı olarak özelleştirilmiş format kalıpları (pattern) tanımlamanıza izin verir.
import java.text.SimpleDateFormat;
import java.util.Date;
String kalip = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(kalip);
String formatlanmisTarih = sdf.format(new Date());
System.out.println(formatlanmisTarih);
💬 Tarihi yyyy-MM-dd HH:mm:ss biçiminde yazar.
Çıktı: 2025-10-26 22:53:01
📘 Kalıp Söz Dizimi (Pattern Syntax)
Aşağıdaki tablo, tarih/saat biçimlendirmede kullanılan en yaygın harfleri özetler 👇
| Kalıp Harfi | Açıklama | Örnek Çıktı |
|---|---|---|
| y | Yıl (4 haneli: yyyy) | 2025 |
| M | Ay (Sayı: MM, Kısaltma: MMM, Tam: MMMM) | 10 / Eki / Ekim |
| d | Ayın günü | 26 |
| E | Haftanın günü | Paz |
| H | Günün saati (0-23) | 22 |
| m | Dakika | 53 |
| s | Saniye | 01 |
| z | Saat dilimi | GMT+03:00 |
| a | AM/PM göstergesi | ÖS |
| Z | RFC saat farkı | +0300 |
| X | ISO saat farkı | +03:00 |
🧩 3. Tarihi Metne Dönüştürme (format)
format() metodu, Date nesnesini tanımlanan kalıba göre String olarak döndürür.
String kalip = "dd MMMM yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(kalip);
String tarih = sdf.format(new Date());
System.out.println(tarih);
💬 Tarihi “gün ay yıl” biçiminde döndürür.
Çıktı: 26 Ekim 2025
🔄 4. Metni Tarihe Çevirme (parse)
parse() metodu, metin (String) halindeki tarihi bir Date nesnesine dönüştürür. Kalıp, metinle birebir eşleşmelidir.
String kalip = "MM-dd-yyyy";
SimpleDateFormat sdf = new SimpleDateFormat(kalip);
String tarihMetni = "12-01-2025";
try {
Date tarihNesnesi = sdf.parse(tarihMetni);
System.out.println(tarihNesnesi);
} catch (Exception e) {
e.printStackTrace();
}
💬 Tarih string’ini “12-01-2025” olarak parse eder.
Çıktı: Mon Dec 01 00:00:00 TRT 2025
🌍 5. Locale (Dil/Bölge) ile Formatlama
String kalip = "EEEEE MMMMM yyyy HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(kalip, new Locale("fr", "FR"));
String tarih = sdf.format(new Date());
System.out.println(tarih);
💬 Fransızca tarih biçimlendirmesi örneği.
Çıktı: mardi janvier 2025 14:51:02.354+0300
⚠️ Thread-Safety Uyarısı
Hem DateFormat hem de SimpleDateFormat sınıfları thread-safe değildir. Çok iş parçacıklı uygulamalarda, her thread için ayrı bir örnek oluşturmanız gerekir.
🧭 6. Modern Alternatif: java.time API
Java 8 ve sonrası için java.time paketi (LocalDate, LocalDateTime, DateTimeFormatter) önerilir. Bu yapı thread-safe, modern ve performanslıdır.
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
LocalDateTime simdi = LocalDateTime.now();
DateTimeFormatter format = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
System.out.println(simdi.format(format));
💬 Yeni API ile güvenli tarih formatlama.
Çıktı: 26-10-2025 22:53:01
❓ Sıkça Sorulan Sorular (SSS)
- SimpleDateFormat neden thread-safe değildir?
İçinde paylaşılan Calendar nesnesi vardır. Çoklu erişimde veri çakışması yaşanır.
- yyyy-MM-dd formatında tarih nasıl alınır?
new SimpleDateFormat("yyyy-MM-dd").format(new Date());
- MM ve mm farkı nedir?
MM → Ay, mm → Dakika. Büyük/küçük harf farkı önemlidir.
- Tarihi DD MM YYYY’den MM DD YYYY’e çevirmek için ne yapmalıyım?
Önce parse() ile mevcut metni oku, ardından format() ile yeni kalıba çevir.
- Hangi sınıf modern Java’da önerilir?
java.time.format.DateTimeFormatter → thread-safe, modern ve kolay okunabilir.
🧾 Sonuç
SimpleDateFormat ve DateFormat, Java'nın klasik tarih formatlama araçlarıdır. Ancak yeni projelerde, java.time API’si tercih edilmelidir. Bu sayede hem hatasız hem de çoklu iş parçacıklı ortamlarda güvenli sonuçlar elde edilir.
💡 Rabisu Bulut üzerinde Java uygulamalarınızı çalıştırarak bu örnekleri anında test edebilirsiniz. Modern tarih işlemlerini Rabisu altyapısında deneyin, farkı hissedin 🚀