۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

Calendar را با LocalDate در برنامه های جاوا جایگزین کنید

کلاس Calendar جاوا روز خود را داشت، اما کلاس جدیدتر LocalDate کارهای بیشتری انجام می دهد. در اینجا هفت راه برای استفاده از LocalDate در برنامه های جاوا آورده شده است.

کلاس Calendar جاوا روز خود را داشت، اما کلاس جدیدتر LocalDate کارهای بیشتری انجام می دهد. در اینجا هفت راه برای استفاده از LocalDate در برنامه های جاوا آورده شده است.

توسعه دهندگان اغلب نیاز به انجام عملیات برنامه نویسی مانند بازیابی تاریخ جاری، دستکاری تاریخ ها و قالب بندی تاریخ ها در برنامه های خود دارند. در حالی که کلاس سنتی java.util.Calendar جاوا روز خود را داشت، کلاس جدیدتر LocalDate کارهای بیشتری را با خطوط کد بسیار کمتر انجام می دهد. این مقاله شما را با LocalDate و java.time API برای استفاده از تاریخ‌ها، زمان‌ها و مدت زمان در برنامه‌هایتان آشنا می‌کند.

توجه: java.time که در جاوا ۸ معرفی شده است، بسیاری از عناصر محبوب کتابخانه Joda-Time. مفاهیم معرفی شده در اینجا را می توان برای هر یک از کتابخانه ها اعمال کرد، اما استاندارد JDK به طور کلی توصیه می شود.

تقویم را با LocalDate جایگزین کنید

دستکاری تاریخ های تقویم یکی از جنبه های ضروری بسیاری از برنامه های کاربردی نوشته شده در جاوا است. به طور سنتی، توسعه دهندگان برای دریافت تاریخ فعلی به کلاس java.util.Calendar تکیه می کردند:


Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // Note: Months are zero-based
int day = calendar.get(Calendar.DAY_OF_MONTH);

System.out.println(year + "-" + month + "-" + day);

کلاس LocalDate از java-time API جایگزین کارآمدتری ارائه می‌کند::


LocalDate currentDate = LocalDate.now();
System.out.println(currentDate);

در این مثال، تفاوت بین پرحرفی کلاس Calendar سنتی و کلاس LocalDate جدیدتر را مشاهده می کنید. کلاس جدیدتر با کد بسیار کمتر کارهای بیشتری انجام می دهد. در مرحله بعد، به چند روش ساده برای استفاده از خواهیم پرداخت. java.time.LocalDate در برنامه های جاوا شما.

روش های ساده برای استفاده از LocalDate

در اینجا نحوه استفاده از LocalDate برای برگرداندن تاریخ فعلی بر اساس ساعت سیستم آمده است:


System.out.println(LocalDate.now());

در اینجا، یک نمونه LocalDate با سال، ماه و روز مشخص شده ایجاد می‌کنیم:


System.out.println(LocalDate.of(2023, 9, 19));

در این مثال بعدی، یک نمایش رشته ای از تاریخ را تجزیه می کنیم و یک نمونه LocalDate را برمی گردانیم:


String dateString = "2024-04-19";  // ISO-8601 format
LocalDate date = LocalDate.parse(dateString);
System.out.println(date);

در مواردی که فرمت تاریخ متفاوت از ISO-8601 باشد، می‌توانیم از موارد زیر استفاده کنیم:


String dateString = "19/04/2024";  // Custom format
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse(dateString, formatter);
System.out.println(date);

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

Bootstrap 5.3.0 بر حالت تاریک، رنگ های سفارشی تأکید دارد

دستکاری اجزای خاص تاریخ

گاهی اوقات، ما باید بتوانیم با اجزای یک تاریخ مانند روز، ماه، سال، ساعت، دقیقه یا ثانیه کار کنیم. عملیات نمونه شامل مقایسه، محاسبه یا اعتبارسنجی اطلاعات تاریخ است.

در اینجا مثالی از نحوه فراخوانی اجزای خاص تاریخ آورده شده است:


import java.time.LocalDate;

LocalDate date = LocalDate.now();  // Get the current date

System.out.println("Year: " + date.getYear()); // prints the year of the current date
System.out.println("Month: " + date.getMonthValue()); // prints the month of the current date
System.out.println("Day: " + date.getDayOfMonth()); // // prints the day of the current date

System.out.println("Hour: " + dateTime.getHour()); // Prints the hour of the current date
System.out.println("Minute: " + dateTime.getMinute()); // Prints the minute of the current date
System.out.println("Second: " + dateTime.getSecond()); // Prints the second of the current date

شمارش روز، ماه یا سال

در مورد مواردی که باید روزها، ماهها یا سالها را از تاریخ تقویم داده شده اضافه یا کم کنیم چطور؟ در اینجا نحوه برخورد LocalDate این مورد استفاده آمده است:


plusDays(int days) - Adds or subtracts the specified days from the date and returns a new LocalDate instance.
minusDays(int days) - Subtracts days from the date.
plusMonths(int months) - Adds the specified number of months to the date and returns a new LocalDate instance.
minusMonths(int months): Subtracts months from the date.
plusYears(int years) - Adds the specified years from the date and returns a new LocalDate instance.
minusYears(int years) - Subtracts years from the date.

حل چالش سال کبیسه

یک سال کبیسه یک سال تقویمی است که شامل یک روز اضافی یا ۳۶۶ روز در مقابل ۳۶۵ روز معمول است. هر برنامه ای که از تاریخ های تقویمی استفاده می کند باید سال های کبیسه را نیز در نظر بگیرد. خوشبختانه، کلاس Jear java.time این محاسبه را برای ما انجام می دهد:


isLeapYear(): Returns true if the year is a leap year

دو روش برای مقایسه تاریخ ها

مقایسه تاریخ ها کاری است که ما اغلب در برنامه نویسی انجام می دهیم. در اینجا روش قدیمی‌تری برای مقایسه تاریخ‌ها با استفاده از LocalDate و روش compareTo وجود دارد:


import java.time.LocalDate;

LocalDate date1 = LocalDate.now();  // Create the first date object
LocalDate date2 = LocalDate.now();  // Create the second date object

// Compare dates using the compareTo() method
int comparison = date1.compareTo(date2);

if (comparison < 0) {
    System.out.println("Date 1 is before Date 2");
} else if (comparison > 0) {
    System.out.println("Date 1 is after Date 2");
} else if (comparison == 0) {
    System.out.println("Date 1 is equal to Date 2");
}

یک راه ساده‌تر و تمیزتر برای مقایسه تاریخ‌ها استفاده از روش‌های isBefore، isAfter یا isEqual است:


if (date1.isBefore(date2)) {
    System.out.println("Date 1 is before Date 2");
} else if (date1.isAfter(date2)) {
    System.out.println("Date 1 is after Date 2");
} else if (date1.isEqual(date2)) {
    System.out.println("Date 1 is equal to Date 2");
}

محاسبه مدت زمان در واحدهای زمانی

یکی دیگر از نیازهای متداول برای برنامه های تجاری، توانایی محاسبه فواصل زمانی در واحدهای زمانی است. java.time API به ما امکان می دهد این کار را به راحتی انجام دهیم.

داکر با Neo4j، LangChain و Ollama برای راه‌اندازی Gen AI Stack همکاری می‌کند.

این مثال مدت زمان بین دو نقطه در زمان را بر حسب ساعت و دقیقه محاسبه می‌کند:


import java.time.LocalDateTime;
import java.time.Duration;

public class DurationExample {
    public static void main(String[] args) {
        LocalDateTime start = LocalDateTime.of(2024, 4, 1, 10, 0);  // April 1, 2024, 10:00
        LocalDateTime end = LocalDateTime.of(2024, 4, 2, 11, 30);   // April 2, 2024, 11:30

        Duration duration = Duration.between(start, end);
        long hours = duration.toHours();
        long minutes = duration.toMinutes() % 60;

        System.out.println("Duration is " + hours + " hours and " + minutes + " minutes.");
    }
}

در این مورد، مدت زمان ۲۵ ساعت و ۳۰ دقیقه است.

در اینجا، مدت زمان بین دو تاریخ را بر حسب سال، ماه و روز محاسبه می‌کنیم:


import java.time.LocalDate;
import java.time.Period;

public class PeriodExample {
    public static void main(String[] args) {
        LocalDate startDate = LocalDate.of(2024, 1, 1);
        LocalDate endDate = LocalDate.of(2024, 12, 31);

        Period period = Period.between(startDate, endDate);
        System.out.println("Period is " + period.getYears() + " years, " +
                           period.getMonths() + " months, and " +
                           period.getDays() + " days.");
    }
}

خروجی در این مورد ۰ سال، ۱۱ ماه و ۳۰ روز است.

بررسی مناطق زمانی

هنگام کار بر روی یک برنامه کاربردی در تولید، ممکن است با اشکالات ناشی از پیکربندی نادرست مناطق زمانی مواجه شده باشید. گاهی اوقات، برنامه در سروری با منطقه زمانی متفاوت از کشوری که در آن ارائه می شود مستقر می شود. بیایید به روش‌هایی برای مدیریت تفاوت‌ها در مناطق زمانی با استفاده از کلاس‌ها و روش‌های java.time بپردازیم.

ابتدا، می‌توانیم از کلاس ZonedDateTime برای مدیریت تاریخ و زمان با اطلاعات منطقه زمانی استفاده کنیم. در اینجا نحوه بدست آوردن زمان فعلی برای دو منطقه زمانی مشخص شده است:


import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;

public class TimeZoneExample {
    public static void main(String[] args) {
        ZoneId newYorkZone = ZoneId.of("America/New_York");
        ZoneId londonZone = ZoneId.of("Europe/London");
        
        ZonedDateTime nowInNewYork = ZonedDateTime.now(newYorkZone);
        ZonedDateTime nowInLondon = ZonedDateTime.now(londonZone);
        
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        System.out.println("Current time in New York: " + nowInNewYork.format(formatter));
        System.out.println("Current time in London: " + nowInLondon.format(formatter));
    }
}

اگر این کد را در ۱۹ آوریل ۲۰۲۴، ساعت ۱۲:۰۰ UTC اجرا کنیم، خروجی به صورت زیر خواهد بود:

  • زمان کنونی در نیویورک: ۲۰۲۴-۰۴-۱۹ ۰۸:۰۰:۰۰
  • زمان کنونی در لندن: ۲۰۲۴-۰۴-۱۹ ۱۳:۰۰:۰۰

تبدیل بین مناطق زمانی چگونه است؟ در اینجا نحوه تبدیل یک زمان معین از یک منطقه به منطقه دیگر آمده است:


import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class TimeZoneConversion {
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.of(2024, 4, 19, 15, 30);
        ZoneId originalZone = ZoneId.of("Asia/Tokyo");
        ZoneId targetZone = ZoneId.of("America/Los_Angeles");

        ZonedDateTime originalZonedDateTime = ZonedDateTime.of(localDateTime, originalZone);
        ZonedDateTime targetZonedDateTime = originalZonedDateTime.withZoneSameInstant(targetZone);

        System.out.println("Time in Tokyo: " + originalZonedDateTime);
        System.out.println("Time in Los Angeles: " + targetZonedDateTime);
    }
}

خروجی در این مورد خواهد بود:

  • زمان در توکیو: ۲۰۲۴-۰۴-۱۹T15:30+09:00[آسیا/توکیو]
  • زمان در لس آنجلس: ۲۰۲۴-۰۴-۱۹T01:30-07:00[America/Los_Angeles]
PHP در شاخص محبوبیت زبان Tiobe فرو می‌رود

انتقال ساعت تابستانی

اگر به‌درستی مدیریت نشود، انتقال‌های زمان تابستانی (DST) می‌توانند عملکرد برنامه شما را مختل کنند. در اینجا نحوه مدیریت انتقال DST با استفاده از کلاس ZonedDateTime آمده است:


import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;

public class TimeZoneConversion {
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.of(2024, 4, 19, 15, 30);
        ZoneId originalZone = ZoneId.of("Asia/Tokyo");
        ZoneId targetZone = ZoneId.of("America/Los_Angeles");

        ZonedDateTime originalZonedDateTime = ZonedDateTime.of(localDateTime, originalZone);
        ZonedDateTime targetZonedDateTime = originalZonedDateTime.withZoneSameInstant(targetZone);

        System.out.println("Time in Tokyo: " + originalZonedDateTime);
        System.out.println("Time in Los Angeles: " + targetZonedDateTime);
    }
}

خروجی از این محاسبه در اینجا آمده است:

  • قبل از پایان DST: 2024-11-03T01:30-04:00[America/New_York]
  • بعد از پایان DST: 2024-11-03T01:30-05:00[America/New_York]

نتیجه گیری

توسعه دهندگان در اکثر برنامه ها با تاریخ و زمان سروکار دارند. API java.time عناصر کتابخانه joda-time منسوخ شده را در بر می گیرد و آنها را از جاوا ۸ به بعد استاندارد می کند. همانطور که در این مقاله دیدید، java.time ساختارهای قدرتمند بسیاری را برای مدیریت تاریخ و زمان در برنامه های شما ارائه می دهد.

اجازه دهید نکات اصلی این مقاله را مرور کنیم:

  • بسته java.time در مقایسه با کلاس سنتی java.util.Calendar، رویکرد واضح‌تر و شهودی‌تری برای رسیدگی به تاریخ‌ها و زمان‌ها ارائه می‌کند.
  • استفاده از java.time به شما امکان می‌دهد عملیات‌هایی مانند بازیابی تاریخ جاری، دستکاری تاریخ‌ها و قالب‌بندی را با خطوط کد کمتر و پیچیدگی کمتر انجام دهید.
  • توابع

  • java.time API مانند plusDays() و minusMonths() از محاسبات ساده تاریخ پشتیبانی می‌کنند که انجام دادن آن با دشوارتر است. کد>تقویم کلاس.
  • روش‌های جدیدتر مانند isBefore()، isAfter() و isEqual() روشی خوانا و مستقیم‌تر برای مقایسه تاریخ‌ها ارائه می‌دهند. نسبت به استفاده از compareTo().
  • ZonedDateTime مدیریت پیشرفته منطقه زمانی و محاسبات ساعت تابستانی را ساده می کند و ابزارهای قوی برای برنامه های جهانی ارائه می دهد.
  • کتابخانه java.time از گزینه‌های قالب‌بندی و تجزیه تاریخ قدرتمندی پشتیبانی می‌کند که استفاده و درک آن‌ها نسبت به کلاس‌های تاریخ و زمان جاوا ساده‌تر است و خوانایی و قابلیت نگهداری کد را افزایش می‌دهد.
  • کتابخانه مدرن تاریخ به گونه‌ای طراحی شده است که تغییرناپذیر و ایمن باشد، که منجر به عوارض جانبی و خطاهای کمتری در محیط‌های چند رشته‌ای می‌شود.

برای پروژه‌های جدید یا هنگام نگهداری برنامه‌های جاوای موجود، توصیه می‌شود برای مدیریت کارآمدتر، واضح‌تر و قوی‌تر عملیات تاریخ و زمان، به java.time API منتقل شوید.

>