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.

  • ๐Ÿ•’ Miras Tarihi: `java.util.Date` sฤฑnฤฑfฤฑ, bir anฤฑ milisaniye cinsinden saklar ve `toString` metodu aracฤฑlฤฑฤŸฤฑyla varsayฤฑlan bir dize yazdฤฑrฤฑr.
  • ๐Ÿ”ค Desenli Harfler: SimpleDateFormat, รถzel รงฤฑktฤฑ formatlarฤฑnฤฑ tanฤฑmlamak iรงin yyyy, MM, dd, HH, mm, ss ve zzz gibi harfleri kullanฤฑr.
  • ๐Ÿ‡ง๐Ÿ‡ท karลŸฤฑlaลŸtฤฑrma: `compareTo` metodu, iki `Date` รถrneฤŸini kronolojik olarak sฤฑralamak iรงin negatif, sฤฑfฤฑr veya pozitif bir tamsayฤฑ dรถndรผrรผr.
  • ๐Ÿ†• Modern API: Java.time iรงindeki LocalDate, LocalDateTime, ZonedDateTime ve Instant, Date ve Calendar'ฤฑ deฤŸiลŸtirilemez nesnelerle deฤŸiลŸtirir.
  • ๐Ÿงต Konu GรผvenliฤŸi: DateTimeFormatter deฤŸiลŸtirilemez ve paylaลŸฤฑlmasฤฑ gรผvenlidir, SimpleDateFormat ise senkronizasyon veya ThreadLocal sarmalayฤฑcฤฑ gerektirir.
  • ๐Ÿ” Birlikte รงalฤฑลŸabilirlik: Date.toInstant, Date.from ve Calendar.toInstant yardฤฑmcฤฑ fonksiyonlarฤฑnฤฑ kullanarak eski ve yeni API'ler arasฤฑnda dรถnรผลŸtรผrme yapฤฑn.

Java Tarih ve Saat

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.

Date nasฤฑl kullanฤฑlฤฑr? Java

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:

mektupTarih veya Saat BileลŸeniร–rnek E-posta
Gร‡aฤŸ belirleyiciAD
yYฤฑl2026
MYฤฑl iรงindeki ayTemmuz veya Temmuz veya 07
wYฤฑl iรงindeki hafta27
WAydaki hafta2
DYฤฑl iรงindeki gรผn189
dAydaki gรผn10
FAydaki haftanฤฑn gรผnรผ2
EHaftadaki gรผn adฤฑSalฤฑ veya Salฤฑ
uHaftanฤฑn gรผn sayฤฑsฤฑ (1 = Monday(7 = Pazar)1
aAM veya PM iลŸaretรงisiPM
HGรผn iรงindeki saat (0-23)0
kGรผn iรงindeki saat (1-24)24
KSabah veya รถฤŸleden sonra saat (0-11)0
hSabah veya รถฤŸleden sonra saat (1-12)12
mSaat cinsinden dakika30
sDakikada ikinci55
SMilisaniye978
zSaat dilimi (adฤฑ)Pasifik Standart Saati; PASฤฐFฤฐK ZAMAN DฤฐLฤฐMฤฐ; GMT-08:00
ZSaat dilimi (RFC 822 ofseti)-0800
XSaat 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:

  1. Tarih formatฤฑ gereklidir: 2012.10.23 20:20:45 PSTUygun format kalฤฑbฤฑ ลŸรถyledir: yyyy.MM.dd HH:mm:ss zzz.
  2. 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

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:

  • LocalDate Zaman veya saat dilimi belirtilmemiลŸ bir tarih iรงin (รถrneฤŸin, doฤŸum gรผnรผ).
  • LocalTime Tarih veya saat dilimi bilgisi olmayan, duvar saati ลŸeklinde gรถsterilen bir saat.
  • LocalDateTime Bรถlge belirtilmeden tarih ve saat iรงin.
  • ZonedDateTime Belirli bir saat dilimine sahip bir tarih ve saat iรงin.
  • OffsetDateTime UTC ofsetli ancak adlandฤฑrฤฑlmฤฑลŸ bรถlge belirtilmemiลŸ bir tarih ve saat iรงin.
  • Instant UNIX baลŸlangฤฑรง โ€‹โ€‹zamanฤฑndan itibaren รถlรงรผlen bir makine zaman damgasฤฑ iรงin.
  • Duration hem de Period Zaman 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. MMM hem de EEE TaลŸฤฑnabilir deฤŸil. Yerel ayarฤฑ aรงฤฑkรงa belirtin (รถrneฤŸin, Locale.ENGLISH).
  • Saat dilimleri konusunda aรงฤฑk ve net olun. LocalDateTime Bรถlge yok, bu yรผzden dรถnรผลŸtรผrรผn ZonedDateTime or Instant ร–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), ve calendar.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 Instant veya bir ISO 8601 dizesi) ve yalnฤฑzca gรถrรผntรผleme sฤฑrasฤฑnda kullanฤฑcฤฑ bรถlgesine dรถnรผลŸtรผrรผn.

SSS

Sistem saat diliminde tarih ve saat almak iรงin `java.time` paketinden `LocalDateTime.now()` yรถntemini, yalnฤฑzca tarih almak iรงin ise `LocalDate.now()` yรถntemini รงaฤŸฤฑrฤฑn. JavaGeรงerli anฤฑ almak iรงin `java.util.Date()` kullanฤฑn.

`java.util.Date`, epoch'tan bu yana geรงen milisaniye cinsinden bir anฤฑ temsil eder ve deฤŸiลŸtirilebilir. `LocalDate` ise zaman veya saat dilimi iรงermeyen bir takvim tarihini modeller, deฤŸiลŸtirilemez ve iลŸ parรงacฤฑฤŸฤฑ gรผvenlidir ve `plusDays` ve `isBefore` gibi daha net yรถntemler sunar.

Hayฤฑr. SimpleDateFormat, deฤŸiลŸtirilebilir ayrฤฑลŸtฤฑrma durumunu korur ve iลŸ parรงacฤฑklarฤฑ arasฤฑnda paylaลŸฤฑldฤฑฤŸฤฑnda yanlฤฑลŸ sonuรงlar รผretir. Bunu bir ThreadLocal iรงine alฤฑn, รถrnek รผzerinde senkronize edin veya deฤŸiลŸtirilemez ve gรผvenli olan DateTimeFormatter'a geรงin.

Tam olarak โ€œyyyy-MM-ddโ€ dizesini girin. Bรผyรผk harf MM ayฤฑ, kรผรงรผk harf mm ise dakikayฤฑ temsil eder. Tam tarih ve saat iรงin โ€œyyyy-MM-dd HH:mm:ssโ€ kullanฤฑn. Ay adlarฤฑnฤฑn tekrarlanabilir kalmasฤฑ iรงin her zaman bir Yerel Ayar belirtin.

Eski Date sฤฑnฤฑfฤฑyla, negatif, sฤฑfฤฑr veya pozitif bir tamsayฤฑ dรถndรผren compareTo yรถntemini kullanฤฑn. java.time ile ise LocalDate veya Instant รผzerinde isBefore, isAfter veya isEqual yรถntemlerini รงaฤŸฤฑrฤฑn. Her iki yaklaลŸฤฑm da kronolojik sฤฑrayฤฑ dikkate alฤฑr.

Tarih iรงin `date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()` yรถntemini kullanฤฑn. Geriye dรถnmek iรงin `Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())` yรถntemini kullanฤฑn. Tam anฤฑn รถnemli olduฤŸu durumlarda bรถlgeyi aรงฤฑkรงa seรงin.

Gรผnlรผk ve belge veri kรผmeleri รผzerinde eฤŸitilmiลŸ yapay zeka modelleri, รถrnek dizelerden olasฤฑ kalฤฑbฤฑ รงฤฑkarฤฑr ve eลŸleลŸen bir DateTimeFormatter kalฤฑbฤฑ dรถndรผrรผr. Makine รถฤŸrenimi sฤฑnฤฑflandฤฑrฤฑcฤฑlarฤฑ ayrฤฑca ay-gรผn veya gรผn-ay sฤฑrasฤฑ gibi belirsiz alanlarฤฑ da iลŸaretler.

Evet. GitHub Copilot, DateTimeFormatter kalฤฑplarฤฑ, ZonedDateTime dรถnรผลŸรผmleri ve JUnit Yerel ayara duyarlฤฑ รงฤฑktฤฑ testleri. RevOnaylamadan รถnce her bir รถneriyi doฤŸru kalฤฑp harfleri, yerel ayar ve saat dilimi aรงฤฑsฤฑndan inceleyin.

Bu yazฤฑyฤฑ ลŸu ลŸekilde รถzetleyin: