این آموزش پکیج java.time.chrono را بهتفصیل پوشش نمیدهد. اما دانستن اینکه این پکیج چندین تقویم غیر-ISO ازپیشتعریفشده مانند Japanese، Hijrah، Minguo و Thai Buddhist ارائه میدهد مفید است. همچنین میتوانید از این پکیج برای ساخت تقویم خودتان استفاده کنید.
این بخش نحوهی تبدیل بین یک تاریخ مبتنی بر ISO و تاریخ در یکی از تقویمهای ازپیشتعریفشدهی دیگر را نشان میدهد.
میتوانید یک تاریخ مبتنی بر ISO را به تاریخی در تقویم دیگر با استفاده از متد فابریکی from(TemporalAccessor) مانند JapaneseDate.from(TemporalAccessor) تبدیل کنید. این متد اگر نتواند تاریخ را به نمونهی معتبر تبدیل کند DateTimeException پرتاب میکند. کد زیر یک نمونهی LocalDateTime را به چند تقویم غیر-ISO ازپیشتعریفشده تبدیل میکند:
LocalDateTime date = LocalDateTime.of(2013, Month.JULY, 20, 19, 30);
JapaneseDate jdate = JapaneseDate.from(date);
HijrahDate hdate = HijrahDate.from(date);
MinguoDate mdate = MinguoDate.from(date);
ThaiBuddhistDate tdate = ThaiBuddhistDate.from(date);
مثال زیر از LocalDate به ChronoLocalDate به String و برعکس تبدیل میکند. متد toString() یک نمونهی LocalDate و یک Chronology میگیرد و رشتهی تبدیلشده را با استفاده از Chronology ارائهشده برمیگرداند. DateTimeFormatterBuilder برای ساخت رشتهای جهت چاپ تاریخ استفاده میشود:
/**
* یک مقدار LocalDate (ISO) را به ChronoLocalDate
* با استفاده از Chronology ارائهشده تبدیل کرده و
* سپس ChronoLocalDate را با یک DateTimeFormatter
* با الگوی SHORT بر اساس Chronology و Locale فعلی
* فرمتبندی میکند.
*
* @param localDate - تاریخ ISO برای تبدیل و فرمتبندی.
* @param chrono - یک Chronology اختیاری. اگر null باشد، IsoChronology استفاده میشود.
*/
public static String toString(LocalDate localDate, Chronology chrono) {
if (localDate != null) {
Locale locale = Locale.of("en", "US");
if (chrono == null) {
chrono = IsoChronology.INSTANCE;
}
DateTimeFormatter dateFormatter =
DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)
.withLocale(locale)
.withChronology(chrono)
.withDecimalStyle(DecimalStyle.of(locale));
return dateFormatter.format(localDate);
} else {
return "";
}
}
هنگام فراخوانی متد با تاریخ زیر برای تقویمهای ازپیشتعریفشده:
LocalDate date = LocalDate.of(1996, Month.OCTOBER, 29);
System.out.printf("%s%n",
toString(date, JapaneseChronology.INSTANCE));
System.out.printf("%s%n",
toString(date, MinguoChronology.INSTANCE));
System.out.printf("%s%n",
toString(date, ThaiBuddhistChronology.INSTANCE));
System.out.printf("%s%n",
toString(date, HijrahChronology.INSTANCE));
خروجی به صورت زیر است:
10/29/8 H
10/29/85 Minguo
10/29/2539 BE
6/16/1417 AH
میتوانید از یک تاریخ غیر-ISO به نمونهی LocalDate با استفاده از متد Static LocalDate.from() تبدیل کنید:
LocalDate date = LocalDate.from(JapaneseDate.now());
سایر کلاسهای مبتنی بر Temporal نیز این متد را ارائه میدهند که در صورت عدم امکان تبدیل، DateTimeException پرتاب میکند.
متد fromString() زیر یک String حاوی تاریخ غیر-ISO را پارس کرده و نمونهای از LocalDate برمیگرداند.
/**
* یک String را با یک DateTimeFormatter با الگوی short
* بر اساس Locale فعلی و Chronology ارائهشده به
* ChronoLocalDate پارس کرده و سپس آن را به مقدار
* LocalDate (ISO) تبدیل میکند.
*
* @param text - متن تاریخ ورودی در قالب SHORT مورد انتظار
* برای Chronology و Locale فعلی.
*
* @param chrono - یک Chronology اختیاری. اگر null باشد، IsoChronology
* استفاده میشود.
*/
public static LocalDate fromString(String text, Chronology chrono) {
if (text != null && !text.isEmpty()) {
Locale locale = Locale.of("en", "US");
if (chrono == null) {
chrono = IsoChronology.INSTANCE;
}
String pattern = "M/d/yyyy GGGGG";
DateTimeFormatter df = new DateTimeFormatterBuilder()
.appendPattern(pattern)
.toFormatter(locale)
.withChronology(chrono)
.withDecimalStyle(DecimalStyle.of(locale));
TemporalAccessor temporal = df.parse(text);
return LocalDate.from(temporal, df);
}
return null;
}
هنگام فراخوانی متد با رشتههای زیر:
System.out.printf("%s%n", fromString("10/29/0008 H",
JapaneseChronology.INSTANCE));
System.out.printf("%s%n", fromString("10/29/0085 Minguo",
MinguoChronology.INSTANCE));
System.out.printf("%s%n", fromString("10/29/2539 BE",
ThaiBuddhistChronology.INSTANCE));
System.out.printf("%s%n", fromString("6/16/1417 AH",
HijrahChronology.INSTANCE));
رشتههای چاپشده باید همگی به ۲۹ اکتبر ۱۹۹۶ تبدیل شوند:
1996-10-29
1996-10-29
1996-10-29
1996-10-29
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/