25 Mart 2020 Çarşamba

DateTimeFormatter Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.time.format.DateTimeFormatter;
constructor
Bu sınıfı kurmak için
1.DateTimeFormatterBuilder sınıfı kullanılabilir.
2. DateTimeFormatter.ofPattern() metodu kullanılabilir.

parse işlemi
1. Bu sınıfın kendi parse metodu kullanılabilir veya
2. Bu sınıfın nesnesi LocalDate.parse(), ZonedDateTime.parse (), OffsetDateTime.part() metoduna parametre olarak geçilebilir.

- Eğer birinci yöntem kullanılırsa DateTimeFormatter.parse() metodunun ikinci parametresi çıktı olaran hangi nesneyi istediğimizi belirtir.
- Eğer ikinci yöntem kullanılırsa zaten LocalDate.parse() zaten yine LocalDateTime nesnesi döndürür.

format işlemi
1. Bu sınıfın kendi format metodu kullanılabilir veya
2. Bu sınıfın nenesi LocateDateTime.format(), LocateDate.format() metoduna parametre olarak geçilebilir.

Her iki kullanımda da bir String elde deriz.


Sabit Alanlar
Soru şöyle. Z karakteri ile başlamayan offsetleri anlatıyor
On Wikipedia time zone offsets are explained as the difference in hours and minutes from standard UTC time. However, DateTimeFormatter supports zone-offset pattern XXXXX, which "outputs the hour and minute and optional second, with a colon, such as '+01:30:15'."

Are offsets like +01:30:15 ISO valid? If not, based on which standard does Java define such offsets?
Cevabı şöyle.
It's not supported by ISO-8601, but it is a valid offset as recorded in the IANA time zone database.

Sub-minute offsets are common in the data for the late 19th and early 20th century, before time zones were properly standardized. For example, Europe/Paris had an offset of +00:09:21 until 1911 (according to the IANA database).

The latest occurrence I can find for this is Africa/Monrovia which had a sub-minute offset until 1972!
Sabitler
DateTimeFormatter Örüntü Sabitleri yazısına taşıdım.

constructor
Örnek
Şöyle yaparız.
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                    .appendPattern("YYYYww")
                                    .parseDefaulting(WeekFields.ISO.dayOfWeek(), 1)
                                    .toFormatter();
LocalDate parse = LocalDate.parse("201803", formatter);
Çıktı olarak şunu alırız.
2018-01-15
format metodu - TemporalAccessor
Parametre olarak TemporalAccessor tipi alır. Yani DayOfWeek, HijrahDate, HijrahEra, Instant, IsoEra, JapaneseDate, JapaneseEra, LocalDate, LocalDateTime, LocalTime, MinguoDate, MinguoEra, Month, MonthDay, OffsetDateTime, OffsetTime, ThaiBuddhistDate, ThaiBuddhistEra, Year, YearMonth, ZonedDateTime, ZoneOffset gibi bir sürü sınıfı formatlayabilir.

Örnek
Şö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
ISO_LOCAL_DATE_TIME Alanı
Şu formatta çıktı verir. Ancak unutulmaması gerek şey aslında bu formattaki en kısa çıktıyı verir. Yani SSS alanı 00 ise çıktıya dahil etmz.
yyyy-MM-ddThh:mm:ss.SSS
Örnek
Şöyle yaparız.
long time = System.currentTimeMillis();
ISO_LOCAL_DATE_TIME.format(Instant.ofEpochMilli(time).atZone(ZoneOffset.UTC))
Çıktı olarak şunu alırız.
// "2017-03-07T12:09:04.374"
Örnek
Elimizde şöyle bir kod olsun. Burada en kısa çıktıyı verdiği görülebilir.
public static void main(String[] args) {
    DateTimeFormatter isoDtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
    List <LocalDateTime> times =
        Arrays.asList(LocalDateTime.now(),
            LocalDateTime.parse("2020-09-13T20:53", isoDtf),
            LocalDateTime.parse(LocalDateTime.now().format(isoDtf)));
    // and explicitly output the formatter LocalDateTime
    for (LocalDateTime time: times)
        System.out.println("Time: "+ time.format(isoDtf));
}
Çıktı olarak şunu alırız
Time: 2020-09-15T15:12:55.592
Time: 2020-09-13T20:53:00
Time: 2020-09-15T15:12:55.623
RFC_1123_DATE_TIME Alanı
Örnek
Şöyle yaparız.
String lastUpdatedString = "Wed, 25 Mar 2020 08:00:00 +0200";
OffsetDateTime dateTime = OffsetDateTime
  .parse(lastUpdatedString, DateTimeFormatter.RFC_1123_DATE_TIME);
System.out.println(dateTime);
Çıktı olarak "2020-03-25T08:00+02:00" alırız

ofLocalizedX metodu
Örnek
Şöyle yaparız
var date = LocalDate.of(2022,Month.JANUARY,1);
var time = LocalTime.of(2,3,4,5);
var datetime = LocalDateTime.of(d, t);

date.format(DateTimeFormatter.ISO_LOCAL_DATE);
// 2022-01-01

time.format(DateTimeFormatter.ISO_LOCAL_TIME));
// 02:03:04.000000005

datetime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
// 2022-01-01T02:03:04.000000005

var f1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");
datetime.format(f1));   // 01-01-2022 02:03:04

var f2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);
f2.format(date);     // 1/1/22
f2.format(time));    // Error
f2.format(datetime));// 1/1/22
var f3 = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT);
f3.format(date);    // Error
f3.format(time);    // 2:03 AM
f3.format(datetime);   // 2:03 AM
var f4 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
f4.format(date);    // Error
f4.format(time);    // Error
f4.format(datetime); // 1/1/22, 2:03 AM
ofPattern metodu - String
Örnek
Şöyle yaparız.
DateTimeFormatter fmt= DateTimeFormatter.ofPattern("dd/MM/yyyy");
Örnek
Şöyle yaparız.
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
Örnek
Şöyle yaparız
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm a");
LocalTime localTime = LocalTime.parse("10:45 pm", formatter);
ofPattern metodu - String + Locale
Şöyle yaparız.
DateTimeFormatter inputFormatter = DateTimeFormatter
  .ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH);
parse metodu - String + TemporalQuery
TemporalAccessor tipi döner. Yani DayOfWeek, HijrahDate, HijrahEra, Instant, IsoEra, JapaneseDate, JapaneseEra, LocalDate, LocalDateTime, LocalTime, MinguoDate, MinguoEra, Month, MonthDay, OffsetDateTime, OffsetTime, ThaiBuddhistDate, ThaiBuddhistEra, Year, YearMonth, ZonedDateTime, ZoneOffset gibi bir sürü sınıfı parse edebilir.

Örnek
Şöyle yaparız.
ZonedDateTime zdt = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss‌​.SSSZ").
  parse("2015-‌​01-12T05:00:00.000+0‌​000", ZonedDateTime::from);
Örnek
Elimzde şu değerler olsun.
String format = "uuuuMM";
String value = "201712";
Şöyle yaparız.
DateTimeFormatter.ofPattern(format).withResolverStyle(ResolverStyle.STRICT)
    .parse(value, YearMonth::from);
withChronology metodu
Şöyle yaparız.
DateTimeFormatter DATE_FORMATTER = DateTimeFormatter
                .ofPattern("uuuu-MM-dd")
                .withChronology(IsoChronology.INSTANCE)
                .withResolverStyle(ResolverStyle.STRICT);
withResolverStyle metodu
Şöyle yaparız.
DateTimeFormatter fmt = ...;
DateTimeFormatter fmt = fmt.withResolverStyle (ResolverStyle.STRICT);
withZone metodu
Şöyle yaparız.
ZoneId zoneID = ...;
DateTimeFormatter fmt = ...;
DateTimeFormatter fmt = fmt.withZone(zoneID);

Hiç yorum yok:

Yorum Gönder