5 Şubat 2020 Çarşamba

SimpleDateFormat Sınıfı - Kullanmayın java.util.Date ile Çalışır

Giriş
Şu satırı dahil ederiz.
import java.text.SimpleDateFormat;
SimpleDateFormat saat dilimi, yaz saati geçişi (DST), locale formatı bilgisine sahiptir. Bu sınıf abstract olan DateFormat sınıfından kalıtır. Şu satırı dahil ederiz.
import java.text.DateFormat;
Bu sınıf yerine Java 8 ile gelen DateTimeFormatter kullanılırsa daha iyi.

Örüntü Sabitleri
SimpleDateFormat Örüntü Sabitleri yazısına taşıdım

constructor - Pattern
Şöyle yaparız.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
2. Tek tırnak içindeki karakterler
Belirtilen karakterler dikkate alınmaz. Genelde tarih ile ilgili olmayan gereksiz kısımlar süzmek için kullanılır.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss");
Date date = format.parse("2016.02.05 AD at 23:59:30");
constructor - Pattern + Locale
Format yanında Locale kullanılabilir. Şöyle yaparız.
SimpleDateFormat sdf = new SimpleDateFormat("...", Locale.US);
Şöyle yaparız
SimpleDateFormat sdf = new SimpleDateFormat("...", Locale.ENGLISH);
Şöyle yaparız
SimpleDateFormat sdf = new SimpleDateFormat("...",Locale.getDefault());
format metodu - Date
Belirtilen Date nesnesini string'e çevirir. Şöyle yaparız.
DateFormat sdf = new SimpleDateFormat("...");
Date date = new Date();
sdft.format (date);
Sadece gün-ay-yılı göstermek için şöyle yaparız.
Date date = ...;
SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
sdf.format (date);
Sadece saati göstermek için şöyle yaparız.
Date date = ...;
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
sdf.format (date);
AM/PM için şöyle yaparız.
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss a");
String str = sdf.format(date);
Calendar ile çalışmak için şöyle yaparız.
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
dff.format (c.getTime());
getDateInstance metodu
Şöyle yaparız.
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
Ya da belli bir locale veririz.
DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT, Locale.GERMANY);
parse metodu - String
Belirtilen string'i tekrar Date nesnesine çevirir. ParseException atabilir. Şu satırı dahil ederiz.
import java.text.ParseException;
Bu metod yaz saati (DST) geçişlerinden haberdardır.
Örnek
Elimizde şöyle bir kod olsun. Çıktı olarak 28 alırız
TimeUnit.DAYS.convert(
  Math.abs(
    new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("30-03-2020 00:00:00").getTime() - 
    new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").parse("1-03-2020 00:00:00").getTime()
  ,
TimeUnit.MILLISECONDS)
Açıklaması şöyle. Yaz saatine geçince saatler 1 saat ileri alındığı için biz matematiksel olarak 29 gün geçmesini beklerken, UTC açısından 28 gün ve 23 saat geçmiştir.
The problem is that because of Daylight Saving Time shift (on Sunday, March 8, 2020), there are 28 days and 23 hours between those dates. TimeUnit.DAYS.convert(...) truncates the result to 28 days.
Düzeltmek için UTC saat dilimini kullanırız. Şöyle yaparız
SimpleDateFormat fmt = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
fmt.setTimeZone(TimeZone.getTimeZone("UTC"));
long diff = fmt.parse("30-03-2020 00:00:00").getTime() -
            fmt.parse("1-03-2020 00:00:00").getTime();
Çıktı olarak şunu alırız.
2505600000
Days: 29
Hours: 696
Days: 29.0
Örnek
Sadece tarih ile şöyle yaparız.
String myDob= "16/01/1989";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
  date = sdf.parse (myDob);
} catch (ParseException e) {
  // handle exception here !
}
Örnek
Milisaniye ve time zone ile şöyle yaparız.
String myDob= "2017-08-16T00:00:00.000Z";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SSSXXX");
Date date = null;
try {
  date = sdf.parse (myDob);
} catch (ParseException e) {
  // handle exception here !
}
setLenient metodu
Lenient hoşgörülü demek. Açıklaması şöyle.
Specify whether or not date/time parsing is to be lenient. With lenient parsing, the parser may use heuristics to interpret inputs that do not precisely match this object's format. With strict parsing, inputs must match this object's format.
Şöyle yaparız.
format.setLenient (false);
setTimeZone metodu
Bu sınıf setTimeZone () metodu çağrılmadan yaratılırsa JVM'in default time zone bilgisi ile ilklenir. Dolayısıyla farklı makinelerde farklı sonuçlar elde edebiliriz.

parse edilecek saat, sistem saat diliminden farklı ise önce saat dilimini atarız.
sdf.setTimeZone (TimeZone.getTimeZone("America/New_York"));
GMT'ye göre formatlamak için şöyle yaparız.
DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd/hh-mm z");
sdf.setTimeZone (TimeZone.getTimeZone("GMT"));
UTC'ye göre formalamak için şöyle yaparız.
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
sdf.setTimeZone (TimeZone.getTimeZone("UTC"));
Daha sonra string'i parse ederiz.
SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
isoFormat.setTimeZone (TimeZone.getTimeZone("UTC"));
Date date = isoFormat.parse ("2010-05-23T09:01:02");
toPattern
İmzası şöyle
public String toPattern()
Açıklaması şöyle
Returns a pattern string describing this date format.
Şöyle yaparız.
SimpleDateFormat df = ...;
SimpleDateFormat df2 = new SimpleDateFormat(df.toPattern().replace("yy", "yyyy"));

1 yorum: