28 Mayıs 2020 Perşembe

Date Sınıfı - Kullanmayın

Giriş
Şu satırı dahil ederiz
import java.util.Date;
Saat dilimi bilgisinden mahrumdur, sadece epoch'tan - yani January 1, 1970, 00:00:00 GMT veya UTC - beri geçen süreyi, milisaniye olarak saklar.  Açıklaması şöyle.
The class Date represents a specific instant in time, with millisecond precision.
Sakladığı milisaniyeyi gün,ay yıl, saat gibi parçalamak için uygun metodlar sunmaz. Bu iş için Calendar sınıfı daha uygundur.

Maden Epoch'tan Beri Geçen Süreyi Saklıyor, Neden Bunu Göremiyoruz
Açıklaması şöyle. Çünkü bu nesnenin toString() metodunu UTC değeri yerel saate çeviriyor.
When you print an object of java.util.Date, its toString method returns the date-time in the JVM's timezone, calculated from this milliseconds value. If you need to print the date-time in a different timezone, you will need to set the timezone to SimpleDateFormat and obtain the formatted string from it.
constructor - default
Şöyle kurulur.
Date timeNow = new Date();
Bu kod aslında şuna denktir.
Date timeNow = new Date(System.currentTimeMillis());
Sınıf yazdırılabilir.
System.out.println(new java.util.Date());
constructor - milliseconds
Epoch'tan itibaren geçen milisaniye ile nesneyi oluşturur.
Örnek
Şöyle yaparız.
long ms = 1469109609000;
Date date = new Date(ms);
Örnek
Bu constructor calendar.setTimeInMillis() ile aynıdır. Şöyle yaparız.
Long timeInMilis = 1509966414000l;
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timeInMilis);
System.out.println("Using Calendar instance : "+cal.getTime());

Date date = new Date(timeInMilis);
System.out.println("Using date instance : "+date);
Çıktı olarak şunu alırız.
Using Calendar instance : Mon Nov 06 16:36:54 IST 2017
Using date instance : Mon Nov 06 16:36:54 IST 2017
constructor - yıl + ay + gün  - Kullanmayın
Bu metod yerine GregorianCalendar kullanılabilir.

İmzası şöyle.
new Date(int year, int month, int date) 
Bu metod eski ve  kullanılmamalı açıklaması şöyle.
/**
 * Allocates a <code>Date</code> object and initializes it so that
 * it represents midnight, local time, at the beginning of the day
 * specified by the <code>year</code>, <code>month</code>, and
 * <code>date</code> arguments.
 *
 * @param   year    the year minus 1900.
 * @param   month   the month between 0-11.
 * @param   date    the day of the month between 1-31.
 * @see     java.util.Calendar
 * @deprecated As of JDK version 1.1,
 * replaced by <code>Calendar.set(year + 1900, month, date)</code>
 * or <code>GregorianCalendar(year + 1900, month, date)</code>.
 */
Yani eğer yıl olarak 1994 yılına erişmek istersek ilk parametre 94 olmalı. Bu metod yerine Calender.set(...) metodu kullanılabilir. Ancak fark olarak yıl parametresi 94 yerine 1994 olmalı. Yıl değerinin neden 1900'den başladığına dair bir açıklama şöyle.
Basically the original java.util.Date designers copied a lot from C. What you're seeing is the result of that - see the tm struct. So you should probably ask why that was designed to use the year 1900. I suspect the fundamental answer is "because we weren't very good at API design back when tm was designed." I'd contend that we're still not very good at API design when it comes to dates and times, because there are so many different use cases.
constructor - yıl + ay + gün + saat + dakika - Kullanmayın
Örnek ver

constructor - yıl + ay + gün + saat + dakika + saniye - Kullanmayın
Örnek ver

constructor - String - Kullanmayın
Örnek ver

before metodu
İki Date nesnesini karşılaştırır. Java 8 ile gelen yeni sınıflar isBefore(...) isimli metodlar kullanıyor. Bence daha anlaşılır olmuş.
Date startDate = ...; Date date = ...;
if (date.before(startDate)) {...}
compareTo metodu
Örnek
En büyük tarihi bulmak için şöyle yaparız.
Date finalexamDate = Person.stream()
  .map(PersonDetails::getexamDate)
  .max(Date::compareTo)
  .orElse(null);
from metodu
Java 8 ile gelen Instant nesnesinden Date oluşturur.
LocalDate currentDate = LocalDate.now();
Date d1 = Date.from(currentDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
Aynı şeyi LocalDateTime ile de yapabiliriz.
LocalDateTime localDateTime = ...
Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
getTime
Epoch'tan beri geçen süreyi milisaniye olarak alırız.
Örnek
İki Date arasındaki farkı şöyle alırız.
Date dateA = ...;
Date dateB = ...;

// detect difference
long diffInMillis = Math.abs(dateA.getTime() - dateB.getTime());
if (diffInMillis < 5 * 60 * 1000) {
    // all is good
} else {
    // bad: 5 or more minutes apart
}
toInstant
Eski Java sınıflarını yeni sınıflara çevirmek için kullanılır.
Instant instant = myDate.toInstant();
toLocaleString metodu - Kullanmayın
Bu metodu yerine
DateFormat.getDateTimeInstance()
ile formatlama yapılabilir.

UTS metodu- Kullanmayın
Örnek ver

Hiç yorum yok:

Yorum Gönder