Java Tarih ve Saat
โก Akฤฑllฤฑ รzet
Java Tarih ve saat iลleme, eski java.util.Date ve SimpleDateFormat sฤฑnฤฑflarฤฑnฤฑ, yeni sรผrรผmde tanฤฑtฤฑlan modern java.time API'si ile birleลtirir. Java 8. Bu, geliลtiricilere doฤru takvim รงalฤฑลmalarฤฑ iรงin deฤiลtirilemez, iล parรงacฤฑฤฤฑ gรผvenli tรผrler saฤlar.

Tarih ve saatlerin iลlenmesi Java Planlama mantฤฑฤฤฑ oluลturma, zaman damgalarฤฑnฤฑ kaydetme, raporlar ve denetim izleri oluลturmanฤฑn rutin bir parรงasฤฑdฤฑr. Herhangi bir kod yazmadan รถnce, bir tarihi oluลturan parametreleri bilmek faydalฤฑdฤฑr:
- MKS yฤฑl (iki veya dรถrt basamaklฤฑ olarak).
- MKS ay (iki rakam olarak, ayฤฑn ilk รผรง harfi olarak veya ayฤฑn tam adฤฑ olarak).
- MKS tarih (ayฤฑn gerรงek gรผn numarasฤฑ).
- MKS gรผn (Belirtilen tarihteki gรผnรผn adฤฑ, รถrneฤin Pazar, Pazartesi, Salฤฑ).
Java Zaman รงizelgesindeki bir anฤฑ tanฤฑmlayan dรถnem, yฤฑlฤฑn haftasฤฑ, saat dilimi ve saat farkฤฑ gibi birรงok baลka parametreyi de ortaya รงฤฑkarฤฑr. Aลaฤฤฑdaki bรถlรผmler, รงalฤฑลtฤฑrฤฑlabilir รถrneklerle bunlarฤฑn her birini ele almaktadฤฑr.
Tarihi Gรถrรผntรผle Java
Java Bir saฤlar Date sฤฑnฤฑfฤฑnda java.util Bu sฤฑnฤฑf, milisaniye hassasiyetinde belirli bir zaman anฤฑnฤฑ saklar ve bu anฤฑ yazdฤฑrmak, karลฤฑlaลtฤฑrmak ve biรงimlendirmek iรงin yardฤฑmcฤฑ yรถntemler sunar. Geรงerli tarih ve saati almak iรงin, sฤฑnฤฑfฤฑ varsayฤฑlan kurucusuyla รถrneklendirin:
import java.util.Date; class Date_Ex1 { public static void main(String args[]) { // Instantiate a Date object by invoking its constructor Date objDate = new Date(); // Display the Date and Time using toString() System.out.println(objDate.toString()); } }
รฤฑktฤฑ:
Wed Nov 29 06:36:22 UTC 2017
รrnek, tarihi varsayฤฑlan toString biรงiminde yazdฤฑrฤฑr. Aynฤฑ tarihi farklฤฑ bir biรงimde gรถrรผntรผlemek iรงin รถncelikle biรงimlendirme harflerini anlamanฤฑz gerekir. Java kullanฤฑr.
SimpleDateFormat: Tarihleri โโAyrฤฑลtฤฑrma ve Biรงimlendirme
MKS SimpleDateFormat sฤฑnฤฑfta java.text a'yฤฑ dรถnรผลtรผrรผr Date Nesneyi biรงimlendirilmiล bir dizeye dรถnรผลtรผrรผr ve biรงimlendirilmiล dizeyi tekrar bir nesneye ayrฤฑลtฤฑrฤฑr. DateTarih veya saat bileลenine karลฤฑlฤฑk gelen kalฤฑp harfleri kullanฤฑr. Aลaฤฤฑdaki tabloda desteklenen tรผm harfler listelenmiลtir:
| mektup | Tarih veya Saat Bileลeni | รrnek E-posta |
|---|---|---|
| G | รaฤ belirleyici | AD |
| y | Yฤฑl | 2026 |
| M | Yฤฑl iรงindeki ay | Temmuz veya Temmuz veya 07 |
| w | Yฤฑl iรงindeki hafta | 27 |
| W | Aydaki hafta | 2 |
| D | Yฤฑl iรงindeki gรผn | 189 |
| d | Aydaki gรผn | 10 |
| F | Aydaki haftanฤฑn gรผnรผ | 2 |
| E | Haftadaki gรผn adฤฑ | Salฤฑ veya Salฤฑ |
| u | Haftanฤฑn gรผn sayฤฑsฤฑ (1 = Monday(7 = Pazar) | 1 |
| a | AM veya PM iลaretรงisi | PM |
| H | Gรผn iรงindeki saat (0-23) | 0 |
| k | Gรผn iรงindeki saat (1-24) | 24 |
| K | Sabah veya รถฤleden sonra saat (0-11) | 0 |
| h | Sabah veya รถฤleden sonra saat (1-12) | 12 |
| m | Saat cinsinden dakika | 30 |
| s | Dakikada ikinci | 55 |
| S | Milisaniye | 978 |
| z | Saat dilimi (adฤฑ) | Pasifik Standart Saati; PASฤฐFฤฐK ZAMAN DฤฐLฤฐMฤฐ; GMT-08:00 |
| Z | Saat dilimi (RFC 822 ofseti) | -0800 |
| X | Saat dilimi (ISO 8601 ofseti) | -08 veya -0800 veya -08:00 |
Tablonun tamamฤฑnฤฑ ezberlemenize gerek yok. Yeni bir desen oluลturduฤunuzda tabloya baลvurmanฤฑz yeterli.
SimpleDateFormat Nasฤฑl Kullanฤฑlฤฑr?
SimpleDateFormat bir alt sฤฑnฤฑfฤฑdฤฑr DateFormat Bu รถzellik, yukarฤฑdaki harf kalฤฑplarฤฑnฤฑ kullanarak tarihleri โโbiรงimlendirmenizi ve ayrฤฑลtฤฑrmanฤฑzฤฑ saฤlar. Oluลturmak veya okumak istediฤiniz tam dizeyi tanฤฑmlamak iรงin harfleri birleลtirin.
รrneฤin:
- Tarih formatฤฑ gereklidir: 2012.10.23 20:20:45 PSTUygun format kalฤฑbฤฑ ลรถyledir:
yyyy.MM.dd HH:mm:ss zzz. - Tarih formatฤฑ gereklidir: 09:30:00 AM 23-May-2012Uygun format kalฤฑbฤฑ ลรถyledir:
hh:mm:ss a dd-MMM-yyyy.
Bahลiล: Harf bรผyรผklรผฤรผne dikkat edin. Bรผyรผk harf. M ay, kรผรงรผk harf m รงok kรผรงรผk. Bรผyรผk harf H 24 saatlik bir saattir, kรผรงรผk harflerle yazฤฑlmฤฑลtฤฑr. h Bu, 12 saatlik bir saattir. Bunlarฤฑ karฤฑลtฤฑrmak, sessizce yanlฤฑล รงฤฑktฤฑ รผretir.
Aลaฤฤฑdaki program, geรงerli tarihi iki kez yazdฤฑrฤฑr: bir kez varsayฤฑlan biรงimde ve bir kez de SimpleDateFormat deseni aracฤฑlฤฑฤฤฑyla:
import java.text.SimpleDateFormat; import java.util.Date; class TestDates_Format { public static void main(String args[]) { // Current system date and time is assigned to objDate Date objDate = new Date(); System.out.println(objDate); // Build the target pattern and format the date String strDateFormat = "hh:mm:ss a dd-MMM-yyyy"; SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat); System.out.println(objSDF.format(objDate)); } }
รฤฑktฤฑ:
Wed Nov 29 06:31:41 UTC 2017 06:31:41 AM 29-Nov-2017
Tarihleri โโKarลฤฑlaลtฤฑr รrneฤi
ฤฐki adet sipariล vermenin en gรผvenilir yolu Date nesneler compareTo() Bu yรถntem, รงaฤฤฑran tarih daha erken olduฤunda negatif bir tamsayฤฑ, her iki tarih de eลit olduฤunda sฤฑfฤฑr ve รงaฤฤฑran tarih daha geรง olduฤunda pozitif bir tamsayฤฑ dรถndรผrรผr. Aลaฤฤฑdaki kod parรงasฤฑ iki tarih dizesini ayrฤฑลtฤฑrฤฑr ve bunlarฤฑn gรถreceli sฤฑrasฤฑnฤฑ yazdฤฑrฤฑr:
import java.text.SimpleDateFormat; import java.text.ParseException; import java.util.Date; class TestDates_Compare { public static void main(String args[]) throws ParseException { SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy"); Date dt_1 = objSDF.parse("20-08-1981"); Date dt_2 = objSDF.parse("12-10-2012"); System.out.println("Date1 : " + objSDF.format(dt_1)); System.out.println("Date2 : " + objSDF.format(dt_2)); // compareTo returns > 0 when dt_1 is after dt_2 if (dt_1.compareTo(dt_2) > 0) { System.out.println("Date 1 occurs after Date 2"); } // compareTo returns < 0 when dt_1 is before dt_2 else if (dt_1.compareTo(dt_2) < 0) { System.out.println("Date 1 occurs before Date 2"); } // compareTo returns 0 when both dates are equal else { System.out.println("Both are the same date"); } } }
รฤฑktฤฑ:
Date1 : 20-08-1981 Date2 : 12-10-2012 Date 1 occurs before Date 2
Not: Orijinal kodda bu kalฤฑp kullanฤฑlmฤฑลtฤฑr. dd-mm-yyyy. Kรผรงรผk harf mm Harf, ay deฤil dakika anlamฤฑna geliyor, bu nedenle ayrฤฑลtฤฑrฤฑcฤฑ sessizce yanlฤฑล ay deฤerini รผretti. Yukarฤฑdaki dรผzeltme bรผyรผk harf kullanฤฑyor. MM Ay iรงin, doฤru harf kalฤฑbฤฑ hangisidir?
Java 8. Modern Tarih ve Saat API'si (java.time)
Java 8 tanฤฑtฤฑldฤฑ java.time Joda-Time kรผtรผphanesinden esinlenerek yeniden tasarlanmฤฑล bir API olan bu paket, yeni sฤฑnฤฑflarฤฑ deฤiลtirilemez, iล parรงacฤฑฤฤฑ gรผvenli ve insan takvimini makine zaman รงizelgesinden ayฤฑrฤฑr. En yaygฤฑn tรผrler ลunlardฤฑr:
LocalDateZaman veya saat dilimi belirtilmemiล bir tarih iรงin (รถrneฤin, doฤum gรผnรผ).LocalTimeTarih veya saat dilimi bilgisi olmayan, duvar saati ลeklinde gรถsterilen bir saat.LocalDateTimeBรถlge belirtilmeden tarih ve saat iรงin.ZonedDateTimeBelirli bir saat dilimine sahip bir tarih ve saat iรงin.OffsetDateTimeUTC ofsetli ancak adlandฤฑrฤฑlmฤฑล bรถlge belirtilmemiล bir tarih ve saat iรงin.InstantUNIX baลlangฤฑรง โโzamanฤฑndan itibaren รถlรงรผlen bir makine zaman damgasฤฑ iรงin.Durationhem dePeriodZaman bazlฤฑ ve tarih bazlฤฑ tutarlar iรงin.
Aลaฤฤฑdaki รถrnek, modern API'yi kullanarak geรงerli tarihi, saati, zaman damgasฤฑnฤฑ ve saat dilimini yazdฤฑrฤฑr:
import java.time.LocalDate; import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.time.Instant; import java.time.ZoneId; class ModernDateDemo { public static void main(String args[]) { LocalDate today = LocalDate.now(); LocalDateTime now = LocalDateTime.now(); ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata")); Instant epoch = Instant.now(); System.out.println("LocalDate : " + today); System.out.println("LocalDateTime : " + now); System.out.println("ZonedDateTime : " + zoned); System.out.println("Instant : " + epoch); } }
Her tรผrรผn kendine รถzgรผ fabrika yรถntemleri vardฤฑr (now, of, parse) ve deฤiลtirilemez iลlemler (plusDays, minusHours, withYearOrijinal nesneyi deฤiลtirmek yerine yeni bir deฤer dรถndรผren yรถntemler.
DateTimeFormatter: Tarihleri โโModern Biรงimde Biรงimlendir Java
DateTimeFormatter in java.time.format yerine SimpleDateFormatAynฤฑ desen harf stilini kullanฤฑr, deฤiลtirilemez ve ek senkronizasyona gerek kalmadan iล parรงacฤฑklarฤฑ arasฤฑnda gรผvenle paylaลฤฑlabilir. Sฤฑnฤฑf ayrฤฑca, aลaฤฤฑdaki gibi hazฤฑr sabitler de sunar: ISO_LOCAL_DATE hem de ISO_ZONED_DATE_TIME standart formatlar iรงin.
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; class FormatterDemo { public static void main(String args[]) { LocalDateTime now = LocalDateTime.now(); DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME; DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy"); System.out.println(now.format(iso)); System.out.println(now.format(human)); LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso); System.out.println("Parsed back : " + parsed); } }
Modern API'de iki tarihi karลฤฑlaลtฤฑrmak iรงin ลu komutu kullanฤฑn: isBefore, isAfterya da isEqualBu yรถntemler, diฤerlerinden daha anlaลฤฑlฤฑr bir ลekilde okunabilir. compareTo ve her biriyle รงalฤฑลmak java.time sฤฑnฤฑf.
ฤฐplik Gรผvenliฤi ve En ฤฐyi Uygulamalar Java Tarih ve Saat
Her ikisi de java.util.Date hem de SimpleDateFormat modern eลzamanlฤฑlฤฑktan รถnce JavaVe her birinin bilinen dezavantajlarฤฑ vardฤฑr. รretim kodunda tarih iลlemlerinin doฤru ลekilde yapฤฑlmasฤฑnฤฑ saฤlamak iรงin aลaฤฤฑdaki uygulamalarฤฑ izleyin:
- Date ve Calendar yerine java.time'ฤฑ tercih edin. Yeni tรผrler deฤiลtirilemez ve iล parรงacฤฑฤฤฑ gรผvenlidir ve etki alanฤฑnฤฑ daha doฤru bir ลekilde modeller (zamansฤฑz tarihler, zaman dilimleri olmayan zamanlar vb.).
- SimpleDateFormat'ฤฑ farklฤฑ iล parรงacฤฑklarฤฑ arasฤฑnda paylaลmayฤฑn. Bu sฤฑnฤฑf dahili ayrฤฑลtฤฑrma durumunu saklar ve iล parรงacฤฑฤฤฑ aรงฤฑsฤฑndan gรผvenli deฤildir. Bunu bir iรงine sarฤฑn.
ThreadLocalรrnek รผzerinde senkronize edin veya ลuna geรงin:DateTimeFormatter. - Her zaman bir yerel ayar belirtin. Ay ve gรผn adlarฤฑ JVM'nin varsayฤฑlan yerel ayarฤฑyla deฤiลir; bu da aลaฤฤฑdaki gibi kalฤฑplarฤฑn oluลmasฤฑna neden olur.
MMMhem deEEETaลฤฑnabilir deฤil. Yerel ayarฤฑ aรงฤฑkรงa belirtin (รถrneฤin,Locale.ENGLISH). - Saat dilimleri konusunda aรงฤฑk ve net olun.
LocalDateTimeBรถlge yok, bu yรผzden dรถnรผลtรผrรผnZonedDateTimeorInstantรzellikle gรผnlรผk kayฤฑtlarฤฑ, veritabanฤฑ sรผtunlarฤฑ ve aฤ yรผkleri iรงin, tam anฤฑn รถnemli olduฤu durumlarda. - ฤฐki API arasฤฑnda dรถnรผลรผmรผ dikkatlice yapฤฑn. Kullanฤฑm
date.toInstant(),Date.from(instant), vecalendar.toInstant().atZone(zone)Eski kod ile modern kod arasฤฑndaki sฤฑnฤฑrda. - Zaman damgalarฤฑnฤฑ UTC formatฤฑnda saklayฤฑn. Israr et ve transmit UTC olarak tarihler (bir
Instantveya bir ISO 8601 dizesi) ve yalnฤฑzca gรถrรผntรผleme sฤฑrasฤฑnda kullanฤฑcฤฑ bรถlgesine dรถnรผลtรผrรผn.


