زمان موضوعی ساده به نظر میرسد؛ حتی یک ساعت ارزانقیمت هم میتواند تاریخ و زمان نسبتاً دقیقی ارائه دهد. اما با بررسی دقیقتر، به پیچیدگیهای ظریف و عوامل متعددی پی میبرید که بر درک شما از زمان تأثیر میگذارند. بهعنوان مثال، نتیجهی اضافه کردن یک ماه به ۳۱ ژانویه در سال کبیسه با سالهای عادی متفاوت است. مناطق زمانی (Time Zone) هم پیچیدگی اضافه میکنند. یک کشور ممکن است با اطلاعرسانی کوتاه وارد یا خارج از ساعت تابستانی (Daylight Saving Time) شود، بیش از یک بار در سال این کار را انجام دهد، یا حتی در یک سال خاص کلاً از ساعت تابستانی صرفنظر کند.
رابط Date-Time از تقویم تعریفشده در استاندارد ISO-8601 بهعنوان تقویم پیشفرض استفاده میکند. این تقویم بر اساس سیستم تقویم گرگوریایی (Gregorian Calendar) است و بهصورت جهانی بهعنوان استاندارد عملی نمایش تاریخ و زمان استفاده میشود. کلاسهای اصلی Date-Time API نامهایی مانند LocalDateTime، ZonedDateTime و OffsetDateTime دارند. همهی آنها از سیستم تقویم ISO استفاده میکنند. اگر بخواهید از یک سیستم تقویم جایگزین مانند Hijrah یا Thai Buddhist استفاده کنید، پکیج java.time.chrono امکان استفاده از یکی از سیستمهای تقویم ازپیشتعریفشده را فراهم میکند. یا میتوانید تقویم خودتان را بسازید.
رابط Date-Time از Unicode Common Locale Data Repository (CLDR) استفاده میکند. این مخزن از زبانهای سراسر جهان پشتیبانی میکند و بزرگترین مجموعهی دادههای بومیسازیشده را در خود جای داده است. اطلاعات این مخزن به صدها زبان بومیسازی شده است. Date-Time API همچنین از Time-Zone Database (TZDB) استفاده میکند. این پایگاهداده اطلاعات مربوط به تمام تغییرات منطقهی زمانی در جهان از سال ۱۹۷۰ و تاریخچهی مناطق زمانی اصلی از زمان معرفی این مفهوم را ارائه میدهد.
رابط Date-Time با استفاده از چندین اصل طراحی توسعه یافته است.
متدهای این API بهخوبی تعریف شدهاند و رفتارشان شفاف و قابل پیشبینی است. بهعنوان مثال، فراخوانی یک متد Date-Time با مقدار پارامتر null معمولاً یک NullPointerException تولید میکند.
رابط Date-Time یک رابط روان (Fluent Interface) ارائه میدهد که خواندن کد را آسان میکند. چون اکثر متدها پارامتر null نمیپذیرند و مقدار null برنمیگردانند، میتوان فراخوانی متدها را به هم زنجیر کرد و کد نتیجه را سریعاً فهمید. بهعنوان مثال:
LocalDate today = LocalDate.now();
LocalDate payday = today.with(TemporalAdjusters.lastDayOfMonth()).minusDays(2);
اکثر کلاسهای Date-Time اشیائی تغییرناپذیر (Immutable) تولید میکنند. یعنی پس از ایجاد شیء، نمیتوان آن را تغییر داد. برای تغییر مقدار یک شیء تغییرناپذیر باید شیء جدیدی بهعنوان نسخهی تغییریافتهی شیء اصلی بسازید. این یعنی Date-Time API از نظر تعریف، Thread-Safe است. این موضوع روی API تأثیر میگذارد: بیشتر متدهایی که برای ایجاد اشیاء تاریخ یا زمان استفاده میشوند، به جای Constructor ها، با پیشوند of، from یا with شروع میشوند و متد set وجود ندارد. بهعنوان مثال:
LocalDate dateOfBirth = LocalDate.of(2012, Month.MAY, 14);
LocalDate firstBirthday = dateOfBirth.plusYears(1);
رابط Date-Time در هرجا که ممکن باشد قابل توسعه است. بهعنوان مثال میتوانید Time Adjuster و Query سفارشی خودتان را تعریف کنید یا سیستم تقویم خودتان را بسازید.
رابط Date-Time از پکیج اصلی java.time و چهار پکیج فرعی تشکیل شده است:
java.time هستهی API برای نمایش تاریخ و زمان. شامل کلاسهایی برای تاریخ، زمان، ترکیب تاریخ و زمان، مناطق زمانی، لحظات (Instant)، مدت زمان (Duration) و ساعتها (Clock) است. این کلاسها بر اساس سیستم تقویم ISO-8601 هستند و تغییرناپذیر و Thread-Safe میباشند.java.time.chrono API برای نمایش سیستمهای تقویم غیر از ISO-8601 پیشفرض. امکان تعریف سیستم تقویم سفارشی نیز وجود دارد. این آموزش این پکیج را بهتفصیل پوشش نمیدهد.java.time.format کلاسهایی برای فرمتبندی و پارس کردن تاریخ و زمان.java.time.temporal API گسترشیافته، عمدتاً برای نویسندگان فریمورک و کتابخانهها، که امکان interoperability بین کلاسهای تاریخ و زمان، Query و تنظیم را فراهم میکند. Fieldها (TemporalField و ChronoField) و Unitها (TemporalUnit و ChronoUnit) در این پکیج تعریف شدهاند.java.time.zone کلاسهایی برای پشتیبانی از مناطق زمانی، Offset و قوانین منطقهی زمانی. در بیشتر موارد توسعهدهندگان فقط به ZonedDateTime و ZoneId یا ZoneOffset نیاز دارند.رابط Date-Time مجموعهی غنیای از متدها در کلاسهای متعدد ارائه میدهد. نام متدها تا جای ممکن بین کلاسها یکسان است. بهعنوان مثال بسیاری از کلاسها متد now دارند که مقادیر تاریخ یا زمان لحظهی فعلی مرتبط با آن کلاس را برمیگرداند. متدهای from نیز وجود دارد که تبدیل از یک کلاس به کلاس دیگر را ممکن میسازند.
همچنین استانداردسازی در پیشوند نام متدها وجود دارد. چون اکثر کلاسهای Date-Time تغییرناپذیر هستند، API شامل متدهای set نیست (پس از ایجاد، مقدار یک شیء تغییرناپذیر قابل تغییر نیست. معادل تغییرناپذیر متد set، متد with است). جدول زیر پیشوندهای رایج را فهرست میکند:
| پیشوند | نوع متد | کاربرد |
|---|---|---|
of | static factory | یک نمونه ایجاد میکند. در اینجا factory عمدتاً پارامترهای ورودی را اعتبارسنجی میکند، نه تبدیل. |
from | static factory | پارامترهای ورودی را به نمونهای از کلاس مقصد تبدیل میکند. ممکن است اطلاعاتی از ورودی از دست برود. |
parse | static factory | رشتهی ورودی را پارس کرده و نمونهای از کلاس مقصد تولید میکند. |
format | instance | از Formatter مشخصشده برای فرمتبندی مقادیر یک شیء Temporal و تولید رشته استفاده میکند. |
get | instance | بخشی از وضعیت شیء مقصد را برمیگرداند. |
is | instance | وضعیت شیء مقصد را Query میکند. |
with | instance | نسخهای از شیء مقصد با یک عنصر تغییریافته برمیگرداند. معادل تغییرناپذیر متد set در یک JavaBean. |
plus | instance | نسخهای از شیء مقصد با اضافه شدن مقداری زمان برمیگرداند. |
minus | instance | نسخهای از شیء مقصد با کم شدن مقداری زمان برمیگرداند. |
to | instance | این شیء را به نوع دیگری تبدیل میکند. |
at | instance | این شیء را با شیء دیگری ترکیب میکند. |
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/