SimpleDateFormat etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
SimpleDateFormat etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

25 Mart 2020 Çarşamba

SimpleDateFormat Örüntü Sabitleri

Saat
a : AM/PM Pattern
Örnek ver

HH Pattern: 24 saat
Örnek ver

mm : Dakika
Örnek ver

ss : Saniye
Örnek ver

SSS : Milisaniye

Z - Saat Dilimi 
Örnek ver

Gün
dd Pattern: Gün
Örnek ver

EEE Pattern: Gün ismi
Şöyle yaparız
String dt = "Fri, 13 Apr 2018 02:26:19 -0700 (PDT)";
Date date = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss", Locale.ENGLISH)
  .parse(dt);
Ay
MM Pattern : Sayı ile Ay
Örnek ver

MMM Pattern : Ay İsmi
Örnek ver

Yıl
yyyy : Yıl Pattern
Her zaman bunu kullanmak gerekir.

Örnek
Şöyle yaparız. EEE gün ismi içindir. MMM ay ismi içindir. Z saat dilimi içindir.
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";

SimpleDateFormat formatter = new SimpleDateFormat(pattern, Locale.ENGLISH);
Date date = formatter.parse("Wed, 25 Mar 2020 08:00:00 +0200");
Y: Week year Pattern
Açıklaması şöyle. Yılın ilk Perşembesini içeren hafta ilk hafta kabul ediliyor.
yy is the calendar year, while YY is the ISO-8601 week year.

Today (30 December 2019) is a good example, the calendar year is 2019, but the week year is 2020, because this week is week 1 of 2020. So yy will result in 19, while YY results in 20.
Açıklaması şöyle.
The first week of the year is the week that contains that year's first Thursday
Örnek - YYYY ve yyyy Farkı
Elimizde şöyle bir kod olsun. Her iki durumda da 2019-12-31 tahini formatlamaya çalıştık ancak çıktı farkı. yyyy çıktısında yıl 2019YYYY çıktısında ise yıl 2020!
DateFormat formatUpperCase = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("2019-12-31 to yyyy-MM-dd: " + formatUpperCase.format(strDate));

formatUpperCase = new SimpleDateFormat("YYYY-MM-dd");
System.out.println("2019-12-31 to YYYY/MM/dd: " + formatUpperCase.format(strDate));

//Output
2019-12-31 to yyyy-MM-dd: 2019-12-31
2019-12-31 to YYYY-MM-dd: 2020-12-31
Örnek - 
YYYY ve yyyy Farkı
Elimizde şöyle bir kod olsun.
try {
  String[] dates = {"2018-12-01", "2018-12-31", "2019-01-01"};
  for (String date: dates) {
    SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
    Date d = dt.parse(date);

    SimpleDateFormat dtYYYY = new SimpleDateFormat("YYYY");
    SimpleDateFormat dtyyyy = new SimpleDateFormat("yyyy");

    System.out.println("For date :" + date + " the YYYY year is : " 
      + dtYYYY.format(d)
      + " while for yyyy it's " + dtyyyy.format(d));
  }
} catch (Exception e) {
  System.out.println("Failed with exception: " + e);
}
Çıktı olarak şunu alırız.
For date : 2018-12-01 the YYYY year is : 2018 while for yyyy it's 2018
For date : 2018-12-31 the YYYY year is : 2019 while for yyyy it's 2018
For date : 2019-01-01 the YYYY year is : 2019 while for yyyy it's 2019






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"));