6 Ekim 2020 Salı

DateTimeFormatter Örüntü Sabitleri

Giriş
Sabitleri gösteren bir tablo burada.

Time of Day
"B" Java 17 ile geliyor.
Örnek
Şöyle yaparız
DateTimeFormatter timeOfDayFomatter = DateTimeFormatter.ofPattern("B");
System.out.println(timeOfDayFomatter.format(LocalTime.of(8, 0)));
System.out.println(timeOfDayFomatter.format(LocalTime.of(13, 0)));
System.out.println(timeOfDayFomatter.format(LocalTime.of(20, 0)));
System.out.println(timeOfDayFomatter.format(LocalTime.of(23, 0)));
System.out.println(timeOfDayFomatter.format(LocalTime.of(0, 0)));

// Output
in the morning
in the afternoon
in the evening
at night
midnight

Saat İçin Sabitler
a - am veya pm
Örnek
Açıklaması şöyle. Yani "a" kullanacaksak hangi locale olduğunu belirtmek gerekir.
You need to specify locale. Without it, 'AM' is not going to parse unless your platform default locale is english.
Şöyle yaparız
LocalDateTime date = LocalDateTime.parse("1/1/2020 3:4:7 AM",
  DateTimeFormatter.ofPattern("M/d/uuuu h:m:s a", Locale.ENGLISH));
n - nanosecond
nanosaniye. Kaç tane n yazmak lazım bilmiyorum.

h - Hour
AM/PM düzenine göre saat. Yani saat 0-12 arasındadır
Örnek
Şöyle yaparız
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[EEEE ]ha", Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.format(formatter) + " -local date time with optnal day in format");
Çıktı olarak şunu alırız. Burada tek h kullanıldığı için çıktı 02 şeklinde değil.
Saturday 2PM -local date time with optnal day in format
H - Hour
24 saat düzenine göre saat. Yani saat 0-24 arasındadır

s - saniye
Açıklaması şöyle.
s second-of-minute number
S - milisaniye, microsaniye, nanosaniye
Açıklaması şöyle. Milisaniye 3 hanelidir.
S fraction-of-second fraction
Tarih İçin Sabitler
d - tek haneli sayı şeklindeki date
Gün tek haneli olacaktır.

dd - iki haneli sayı şeklindeki date
Gerekiyorsa gün 0 ile 2 hane olaak şekilde doldurulur (left pad'lenir)

EEE - Gün İsimle Olacaktır
Gün ismi Locale İngilizce ise Monday vs. olacaktır.

Örnek
Şöyle yaparız. Burada [EEE] ile optional gün ismi belirtiliyor. Gerçi LocalDateTime değil LocalTime parse ediliyor yani gün ismi boşa gidiyor ancak iyi bir örnek
String dateTxt = "Monday 5AM";
//for parsing day of week is ignored
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[EEEE ]ha", Locale.ENGLISH);
LocalTime lt = LocalTime.parse(dateTxt, formatter);
System.out.println(lt + " - parsed local time ");
Çıktı olarak şunu alırız
05:00 - parsed local time 
Örnek
Şöyle yaparız
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("[EEEE ]ha", Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.now();
System.out.println(ldt.format(formatter) + " -local date time with optnal day in format");
Çıktı olarak şunu alırız
Saturday 2PM -local date time with optnal day in format
M - tek haneli sayı şeklindeki month
Ay tek haneli olacaktır.

MM - iki haneli sayı şeklindeki month
Gerekiyorsa ay 0 ile 2 hane olacak şekilde doldurulur (left pad'lenir)

MMM - isim ile month
Ay
Örnek
Şöyle yaparız
// the date String
String d = "16 Apr 2020";
// which is parsed to a LocalDate using a formatter with a suitable pattern
LocalDate ld = LocalDate.parse(d, DateTimeFormatter.ofPattern("dd MMM yyyy"));
// then printed in a different format using a formatter with a differen pattern
System.out.println(ld.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")));
Çıktı olarak şunu alırız
16-04-2020
u - year
Yıl : y'den farklı olarak "of no specific era" anlamına gelir. Açıklaması şöyle
yyyy or uuuu rarely matters, but note that this mean 4 digits are required. The difference kicks in for years before 0: uuuu goes negative, yyyy does not and expects you to use e.g. GG so that you get 44 BC instead of -44
Örnek
Şöyle yaparız
String dateTime = "02 Sep 2020 12:24 AM";
DateTimeFormatter parserDtf = DateTimeFormatter.ofPattern("dd MMM uuuu hh:mm a",
                                                                Locale.ENGLISH);
DateTimeFormatter outputDtf = DateTimeFormatter.ofPattern("dd MMM uuuu 'at' hh:mm a",
                                                                Locale.ENGLISH);
LocalDateTime ldt = LocalDateTime.parse(dateTime, parserDtf);
System.out.println(ldt.format(outputDtf));
Çıktı olarak şunu alırız
02 Sep 2020 at 12:24 AM
w - week
Hafta sayısı

y - year
Yıl : u ile farkını yukarıya yazdım

Y - year
Yıl : week-base year.

Saat ve Tarih Ayracı
'T'
String içindeki T alanını temsil eder. Şöyle yaparız.
DateTimeFormatter inputFormatter = DateTimeFormatter
  .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
DateTimeFormatter outputFormatter = DateTimeFormatter
  .ofPattern("dd-MM-yyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse("2018-04-10T04:00:00.000Z", inputFormatter);
String formattedDate = outputFormatter.format(date);
System.out.println(formattedDate); // prints 10-04-2018
Zaman Dilimi
X - UTC Offset Belirtir
Örnek
Açıklaması şöyle.
The X on the end allows for either a Z or an offset-from-UTC such as -08 or -0830 or -08:30 or -083015 or -08:30:15.
Elimizde şöyle bir kod olsun
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmssX")
  .withResolverStyle(ResolverStyle.STRICT);

boolean isParseableBasicIso8601(String str) {
  try {
    OffsetDateTime odt = OffsetDateTime.parse(str, formatter);
    return odt.getOffset().equals(ZoneOffset.UTC);
  } catch (DateTimeParseException dtpe) {
    return false;
  }
}
Şöyle yaparız
String[] testStrings = {
  "20210223T234556Z",
  "Cannot be parsed",
  "20210229T234556Z",
  "20210223T234556+08",
  "20210223T234556+00",
};
    
for (String s : testStrings) {
  System.out.format("%-18s? %s%n", s, isParseableBasicIso8601(s));
}
Çıktı olarak şunu alırız. X ile "Z", "+08", "+00" gibi saat dilimleri parse edilebilmiş.  
20210223T234556Z  ? true
Cannot be parsed  ? false
20210229T234556Z  ? false
20210223T234556+08? false
20210223T234556+00? true
Optional Alanlar
[] karakterleri arasında belirtilir.

Örnek
Şöyle yaparız. Burada string içinde Z zaten yoktur ancak optional olduğu için hata almayız.
LocalDateTime dateTime = LocalDateTime.parse("2017-01-17 09:28:45",
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss['Z']"));
Örnek
Açıklaması şöyle.
The square brackets mean optional. We accommodate either a dot or comma. Note the singular digit for fraction of second. The X on the end allows for either a Z or an offset-from-UTC such as -08 or -0830 or -08:30 or -083015 or -08:30:15.
Şöyle yaparız. Bu aslında 2009-08-13T14:56:07Z şeklindedir.
String input = "20090813145607.0Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmss[,S][.S]X" );
OffsetDateTime odt = OffsetDateTime.parse ( input , f );
Instant instant = odt.toInstant ();

Hiç yorum yok:

Yorum Gönder