API تاریخ
جاوا 8 حاوی APIهای تاریخ و زمان کاملاً جدیدی در بسته java.time است. API جدید Date با کتابخانه
Joda-Time قابل مقایسه است ، اما یکسان نیست. مثالهای زیر مهمترین بخشهای API جدید را پوشش خواهند داد.
ساعت
ساعت دسترسی به تاریخ و زمان فعلی را می دهد. ساعت ها از مناطق زمانی آگاه هستند و بنابراین می توانند به جای
System.currentTimeMillis() برای برگرداندن زمان فعلی بر حسب میلی ثانیه استفاده شوند. این نوع دقت زمانی نیز توسط کلاس
Instant نشان داده می شود .
Instant ها می توانند برای ایجاد اشیاء به ارث برده شده
java.util.Date استفاده شوند .
Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
محدوده های زمانی
مناطق زمانی با کلاس انتزاعی
ZoneId نمایش داده می شوند . با استفاده از روش های آماری کارخانه ای به راحتی می توان به آنها دسترسی داشت. مناطق زمانی، افست هایی را تعریف می کنند که برای تبدیل بین تاریخ و زمان محلی و لحظه ای مهم هستند.
System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
زمان محلی
LocalTime زمان را بدون منطقه زمانی نمایش می دهد، به عنوان مثال 17:30:15. مثال زیر دو شی زمانی محلی برای مناطق زمانی تعریف شده در بالا ایجاد می کند. سپس دو جسم را با هم مقایسه می کنیم و اختلاف ساعت و دقیقه بین آنها را محاسبه می کنیم.
LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239
LocalTime با روشهای مختلف کارخانهای ارائه میشود تا نمونهسازی را آسانتر کند، از جمله تجزیه رشتهها.
LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37
LocalDate
LocalDate تاریخ خاصی را نشان می دهد، به عنوان مثال 2014-03-11. نمونه ها تغییر ناپذیر هستند و مشابه LocalTime کار می کنند. این مثال نحوه محاسبه تاریخ جدید را با جمع یا تفریق روز، ماه یا سال نشان می دهد. به خاطر داشته باشید که هر عملیات روی یک شی، یک شی جدید را برمی گرداند.
LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY
تجزیه LocalDate از یک رشته به سادگی تجزیه LocalTime است:
DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24
LocalDateTime
LocalDateTime تاریخ را نشان می دهد. این ترکیبی از تاریخ و زمان ذکر شده در بالا، در یک نسخه است. نمونه های LocalDateTime تغییرناپذیر هستند و مشابه LocalTime و LocalDate کار می کنند. میتوانیم از روشهایی برای بازیابی مقادیر ویژگیهای نمونه مورد نیاز استفاده کنیم:
LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439
همراه با اطلاعات منطقه زمانی اضافی، نمونه را میتوان به فوری تبدیل کرد. Instant ها را می توان به راحتی به انواع قدیمی که از java.util.Date به ارث می برد تبدیل کرد.
Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014
قالب بندی تاریخ-زمان مانند قالب بندی تاریخ یا زمان عمل می کند. به جای استفاده از فرمت های تاریخ از پیش تعریف شده، می توانیم از فرمت های تعریف شده دستی استفاده کنیم.
DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13
برخلاف java.text.NumberFormat، DateTimeFormatter جدید غیرقابل تغییر است و تاپیک ایمن است. برای اطلاعات بیشتر در مورد نحو برای فرمت های نوشتن،
اینجا را بخوانید .
حاشیه نویسی ها
حاشیه نویسی ها در جاوا 8 قابل تکرار هستند. بیایید به یک مثال نگاه کنیم تا نشان دهیم که چگونه این کار می کند. برای شروع، یک پوشش حاشیهنویسی تعریف میکنیم که آرایهای از حاشیهنویسیهای معتبر را ذخیره میکند:
@interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); }
جاوا 8 ما را قادر میسازد تا با اعلام حاشیهنویسی @Repeatable از چندین حاشیهنویسی از یک نوع استفاده کنیم.
گزینه 1: استفاده از حاشیه نویسی کانتینر (مکتب قدیمی) (جاوا 8 به ما امکان می دهد با اعلام یک حاشیه نویسی @Repeatable از یادداشت های متعدد از یک نوع استفاده کنیم .) گزینه 1: استفاده از محفظه حاشیه نویسی (مکتب قدیمی)
@Hints({@Hint("hint1"), @Hint("hint2")}) class Person {}
گزینه 2: استفاده از حاشیه نویسی های تکرار شونده ( ویژگی جدید)
@Hint("hint1") @Hint("hint2") class Person {}
با استفاده از گزینه دو، کامپایلر جاوا به طور ضمنی حاشیه نویسی @Hint را تنظیم می کند. این برای خواندن اطلاعات حاشیه نویسی از طریق بازتاب مهم است.
اگرچه حاشیهنویسی @Hints را برای کلاس
Person
Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2
اعلام نکردهایم ، اما میتوان آن را با استفاده از روش
getAnnotation(Hints.class) خواند . با این حال، یک روش راحتتر
getAnnotationsByType است که با استفاده از حاشیهنویسی
@Hint ، دسترسی به تمام حاشیهنویسیها را فراهم میکند . علاوه بر این، استفاده از حاشیه نویسی در جاوا 8 به دو هدف گسترش می یابد:
@Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}
این همه است
آموزش برنامه نویسی جاوا 8 من کامل شد. اگر می خواهید در مورد تمام کلاس های جدید و ویژگی های API در JDK 8 اطلاعات بیشتری کسب کنید، فقط مقاله بعدی من را بخوانید. این به شما کمک میکند تا تمام کلاسهای جدید و ویژگیهای مخفی JDK 8 مانند
Arrays.parallelSort ،
StampedLock و
CompletableFuture را درک کنید .
GO TO FULL VERSION