سلام
تویه این مطلب می خواسم که با همدیگه نحوه کار با کتابخانه Time4j رو بررسی کنیم.
من چندین کتابخونه رو استفاده کردم... ولی بنظرم راحتترین اونها کتابخانه Time4j در جاوا هستش.
کتابخانه های قدیمی و حتی جدیدی هم هستند که شاید کار با اونها راحت باشه... ولی بنظرم این کتابخونه از همه بهتر هستش...
برای مثال کتابخونه icu4j که برای ibm هستش... کتابخانه قدرتمندی هستش... ولی من دایکیومنت خاصی ازش در مورد تاریخ فارسی ندیدم.
و اینکه خیلی هم سنگین هستش و برنامه رو واقعا از نظر حجمی سنگین می کنه.. اونم بخاطر یک تبدیل تاریخ ساده.
خوب حالا بهتره که زیاد به هواشی نپردازیم و بریم سر اصل مطلب.
اصل مطلب یعنی کتابخانه Time4j ...
من چند مدل کد و مثال رو قرار میدم و خودتون بعدا می تونید اونها رو اجرا کنید و ازش استفاده کنید.
ولی قبل از قرارداد کد باید بهتون بگم که من از ورژن 5.9.1 استفاده کردم.
<dependency> <groupId>net.time4j</groupId> <artifactId>time4j-base</artifactId> <version>5.9.1</version> </dependency>
و حالا یک مثالی که خودم ازش استفاده کردم و کدهای خودم رو نوشتم.. شما هم می تونید ازش استفاده کنید:
import java.text.ParseException; import java.time.format.FormatStyle; import java.util.Locale; import net.time4j.Moment; import net.time4j.PlainDate; import net.time4j.SystemClock; import net.time4j.TemporalType; import net.time4j.calendar.PersianAlgorithm; import net.time4j.calendar.PersianCalendar; import net.time4j.engine.CalendarDate; import net.time4j.format.expert.ChronoFormatter; import net.time4j.format.expert.PatternType; import net.time4j.tz.olson.ASIA; public class DateUtil { public static void main(String[] args) throws ParseException { PersianCalendar pcal = PersianCalendar.of(1401, 07, 30); // = 2025-03-20 (gregorian) ChronoFormatter<PersianCalendar> f = ChronoFormatter .ofPattern("yyyy/MM/dd", PatternType.CLDR, Locale.ROOT, PersianCalendar.axis()) .with(PersianAlgorithm.attribute(), PersianAlgorithm.BIRASHK); System.out.println(f.format(pcal)); /////////////////////////////////////////////// // conversion from jalali to gregorian by constructed input PersianCalendar jalali = PersianCalendar.of(1394, 11, 5); // or use a safe enum instead of the month number: // PersianCalendar jalali = PersianCalendar.of(1394, PersianMonth.BAHMAN, 5); PlainDate gregorian = jalali.transform(PlainDate.class); System.out.println(gregorian); // 2016-01-25 // conversion to millis-since-unix (timezone-dependent) Moment moment1 = gregorian.atStartOfDay().inTimezone(ASIA.TEHRAN); long millisSinceUnix = TemporalType.MILLIS_SINCE_UNIX.from(moment1); System.out.println(millisSinceUnix); // 1453667400000L // conversion of millis-since-unix to jalali (timezone-dependent) Moment moment2 = TemporalType.MILLIS_SINCE_UNIX.translate(millisSinceUnix); PlainDate gregorian2 = moment2.toZonalTimestamp(ASIA.TEHRAN).toDate(); System.out.println(gregorian2.transform(PersianCalendar.class)); // AP-1394-11-05 // formatting and parsing in Farsi language using full style ChronoFormatter<PersianCalendar> f1 = ChronoFormatter.ofStyle(FormatStyle.FULL, new Locale("fa"), PersianCalendar.axis()); System.out.println(f1.format(jalali)); // ه.ش. ۱۳۹۴ بهمن ۵, دوشنبه // formatting in English language using custom pattern ChronoFormatter<PersianCalendar> f2 = ChronoFormatter.ofPattern("yyyy/MM/dd", PatternType.CLDR, Locale.ENGLISH, PersianCalendar.axis()); System.out.println(f2.format(jalali)); // 5. Bahman 1394 ChronoFormatter<PersianCalendar> formatter = ChronoFormatter.setUp(PersianCalendar.axis(), new Locale("fa")) .addPattern("EEE, d. MMMM yyyy", PatternType.CLDR_DATE).build(); PlainDate today = SystemClock.inLocalView().today(); PersianCalendar jalali2 = today.transform(PersianCalendar.class); System.out.println(formatter.format(jalali2)); //////////////////////////////////////////////////////////////////////// Locale loc = Locale.forLanguageTag("de-IR-u-ca-persian"); ChronoFormatter<CalendarDate> formatter3 = ChronoFormatter.ofGenericCalendarStyle(FormatStyle.MEDIUM, loc); PersianCalendar jalali3 = PersianCalendar.of(1393, 1, 10); PlainDate gregorian3 = jalali3.transform(PlainDate.class); System.out.println(formatter3.format(jalali3)); System.out.println(formatter3.format(gregorian3)); } }
این یک مدل ساده هستش که وقتی اجراش کنید می تونید از ساختارش برای کدهای خودتون استفاده کنید و خروجی زیر رو هم بهتون میده:
1401/07/30 2016-01-25 1453667400000 AP-1394-11-05 ۱۳۹۴ بهمن ۵, دوشنبه 1394/11/05 چهارشنبه, ۱۲. بهمن ۱۴۰۱ 10.01.1393 AP 10.01.1393 AP
حالای مثالی که خودم هم برای بخشی از پروژه خودم ازش استفاده کردم هم در زیر اومده:
import net.time4j.Moment; import net.time4j.PlainDate; import net.time4j.SystemClock; import net.time4j.TemporalType; import net.time4j.calendar.PersianCalendar; import net.time4j.format.expert.ChronoFormatter; import net.time4j.format.expert.PatternType; import net.time4j.tz.olson.ASIA; import java.text.ParseException; import java.util.Date; import java.util.Locale; public class Time4jTest { public static void main(String[] args) throws ParseException { System.out.println(getCurrentDateJalali()); System.out.println(getInputJalaliDateToJalali()); System.out.println(getCurrentTimeStamp(new Date())); } private static String getCurrentDateJalali() { ChronoFormatter<PersianCalendar> formatter = ChronoFormatter.setUp(PersianCalendar.axis(), new Locale("fa")) .addPattern("EEE, d. MMMM yyyy", PatternType.CLDR_DATE).build(); PlainDate today = SystemClock.inLocalView().today(); PersianCalendar jalali = today.transform(PersianCalendar.class); return formatter.format(jalali); } public static String getInputJalaliDateToJalali() { // conversion from jalali to gregorian by constructed input PlainDate today = SystemClock.inLocalView().today(); PersianCalendar jalali = today.transform(PersianCalendar.class); // formatting in English language using custom pattern ChronoFormatter<PersianCalendar> f2 = ChronoFormatter.ofPattern( "EEE, d. MMMM yyyy", PatternType.CLDR, Locale.ENGLISH, PersianCalendar.axis()); return f2.format(jalali); } public static String getCurrentTimeStamp(Date input) { ChronoFormatter<PersianCalendar> formatter = ChronoFormatter.setUp(PersianCalendar.axis(), new Locale("fa")) .addPattern("EEE, d. MMMM yyyy", PatternType.CLDR_DATE).build(); Moment m2 = TemporalType.JAVA_UTIL_DATE.translate(input); PersianCalendar jalali = m2.toZonalTimestamp(ASIA.TEHRAN).toDate().transform(PersianCalendar.class); return formatter.format(jalali); } }
این هم خروجی دستور بالا:
چهارشنبه, ۱۲. بهمن ۱۴۰۱ Wed, 12. Bahman 1401 چهارشنبه, ۱۲. بهمن ۱۴۰۱
در توضیح کد دوم باید بگم که تابع getCurrentDateJalali تاریخ شمسی جاری رو به صورت پارسی چاپ می کنه و تابع getInputJalaliDateToJalali هم تاریخ شمسی جاری رو به صورت انگلیسی نمایش میده.. و تابع getCurrentTimeStamp هم کار تاربع اول رو با استفاده از تاریخ ورودی انجام میده.
امیدوارم که برای شما عزیزام مفید بوده باشه...
مراقب خوبی هاتون باشید
خدانگهدار