در این راهنما به بررسی شیوه مقایسه تاریخ در جاوا با استفاده از Date/Time API در جاوا 8 می‌پردازیم در ادامه روش‌های مختلف بررسی برابر بودن دو تاریخ و شیوه مقایسه تاریخ‌ها را معرفی می‌کنیم.

مقایسه تاریخ

روش مقدماتی برای بیان تاریخ در جاوا به صورت LocalDate است. در ادامه وهله‌های شیء LocalDate را که نماینده 10 آگوست 2019 و اول جولای 2019 است، بررسی می‌کنیم:

در ادامه قصد داریم دو شیء LocalDate را با استفاده از ()isAfter() ،isBefore و ()isEqual و همچنین ()equals و ()compareTo مقایسه کنیم. از متد ()isAfter برای بررسی این که آیا وهله تاریخ پس از تاریخ خاصی است یا نه استفاده می‌کنیم. بدین ترتیب JUnit assertion بعدی پاس می‌شود:

به طور مشابه متد ()isBefore بررسی می‌کند آیا یک وهله از تاریخ پس از تاریخ خاصی است یا نه:

متد ()isEqual بررسی می‌کند آیا یک تاریخ که در تایملاین محلی بیان‌شده است با تاریخ خاصی برابر است یا نه:

مقایسه تاریخ‌ها با اینترفیس Comparable

متد ()equals همان نتیجه ()isEqual را به دست می‌دهد، اما تنها در صورتی که آرگومان ارسالی از همان نوع (در این مورد به صورت LocalDate) باشد:

اما از سوی دیگر متد ()isEqual می‌تواند برای مقایسه دو شیء از نوع متفاوت مانند JapaneseDate ،ThaiBuddhistDate و غیره استفاده شود. می‌توانیم دو وهله از تاریخ را با استفاده از متد ()compareTo چنان که در اینترفیس Comparable تعریف شده‌اند مقایسه کنیم:

مقایسه وهله‌های تاریخ شامل مؤلفه Time

در این بخش شیوه مقایسه دو وهله از LocalDateTime را توضیح می‌دهیم. وهله‌های LocalDateTime شامل تاریخ و همچنین مؤلفه Time هستند. همانند LocalDate در مورد LocalDateTime نیز می‌توانیم وهله‌های مختلف را با استفاده از متدهای ()isAfter() و isBefore و ()isEqual مقایسه کنیم. به علاوه ()equals و ()compareTo می‌توانند به روشی مشابه چنان که در مورد LocalDate توضیح دادیم استفاده شوند.

به طور مشابه می‌توانیم از همان متدها برای مقایسه وهله‌های ZonedDateTime استفاده کنیم. برای نمونه فرض کنید می‌خواهیم زمان محلی 8:00 را در نیویورک با زمان محلی 14:00 در برلین در روز یکسان مقایسه کنیم:

گرچه هر دو وهله ZonedDateTime نماینده لحظه واحدی از زمان هستند، اما اشیای جاوای برابری را نمایندگی نمی‌کنند. آن‌ها در درون خود فیلدهای LocalDateTime و ZoneId متفاوتی دارند:

مقایسه‌های دیگر

در این بخش یک کلاس کاربردی ساده می‌سازیم که برای مقایسه‌های کمی پیچیده‌تر استفاده می‌شود. ابتدا بررسی می‌کند آیا وهله‌های LocalDateTime و LocalDate در روز واحدی هستند یا نه:

سپس بررسی می‌کند آیا دو وهله از LocalDateTime در روز واحدی هستند یا نه:

متد truncatedTo(TemporalUnit) یک تاریخ را روی سطح مفروض خلاصه می‌کند که در این مثال سطح روز مورد نظر است. در ادامه می‌توانیم مقایسه را در سطح ساعت نیز پیاده‌سازی کنیم:

در نهایت به روشی مشابه می‌توانیم بررسی کنیم آیا دو وهله از ZonedDateTime در ساعت یکسانی رخ می‌دهند یا نه:

می‌بینیم که دو شیء ZonedDateTime در عمل درون ساعت واحدی قرار می‌گیرند، هر چند ساعت‌های محلی متفاوت هستند:

مقایسه با API قدیمی Java Date

تا پیش از جاوا 8 مجبور بودیم از کلاس‌های java.util.Date و java.util.Calendar برای دستکاری اطلاعات تاریخ/زمان استفاده کنیم. طراحی API قدیمی java.util.Date و java.util.Calendar معایب زیادی داشت مثلاً پیچیده بود و thread-safe نبود. وهله java.util.Date نماینده یک لحظه در زمان است و نه تاریخ واقعی.

در آن زمان یکی از راه‌حل‌ها استفاده از کتابخانه Joda Time بود. از زمان انتشار نسخه 8 جاوا توصیه شده که از API این نسخه به نام Date/Time استفاده کنیم. اشیای java.util.Date و java.util.Calendar مشابه LocalDate و LocalDateTime دارای متدهای after() ،before() ،compareTo و ()equals برای مقایسه دو وهله از تاریخ هستند. تاریخ‌ها به صورت وهله‌های از زمان و در سطح میکروثانیه مقایسه می‌شوند:

در مورد مقایسه‌های پیچیده‌تر، می‌توانیم از DateUtils از کتابخانه Apache Commons Lang استفاده کنیم. این کلاس شامل متدهای کارآمد زیادی برای کار کردن با اشیای Date و Calendar است:

برای مقایسه اشیای تاریخ که از API-های مختلفی نشأت می‌گیرند، باید ابتدا آن‌ها را به نوع مناسب تبدیل کنیم و سپس می‌توانیم مقایسه را اجرا کنیم.

سخن پایانی

در این مقاله به بررسی روش‌های مختلف برای مقایسه وهله‌های تاریخ در جاوا پرداختیم. کلاس‌های Date/Time در جاوا 8 API-های قدرتمندی برای مقایسه تاریخ‌ها با یا بدون زمان و مناطق زمانی دارند. همچنین با روش مقایسه تاریخ‌ها در سطوح روز، ساعت، دقیقه و غیره آشنا شدیم. همه کدهای معرفی شده در این ریپوی گیت‌هاب (+) در دسترس شما قرار دارند.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

میثم لطفی (+)

«میثم لطفی» دانش‌آموخته ریاضیات و شیفته فناوری به خصوص در حوزه رایانه است. وی در حال حاضر علاوه بر پیگیری علاقه‌مندی‌هایش در رشته‌های برنامه‌نویسی، کپی‌رایتینگ و محتوای چندرسانه‌ای، در زمینه نگارش مقالاتی با محوریت نرم‌افزار نیز با مجله فرادرس همکاری دارد.

آیا این مطلب برای شما مفید بود؟

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *