دوره‌ها / JAVA / تاریخ و زمان (Java Date)

تاریخ و زمان (Java Date)

15 دقیقه Article پیش‌نمایش

کار با تاریخ و زمان: مدیریت زمان در دنیای دیجیتال 📅⏰

جاوا هیچ پکیجِ داخلی برای کلاسِ "تاریخ" به صورت پیش‌فرض ندارد، اما پکیج قدرتمند java.time را برای مدیریت دقیق تاریخ، زمان، مناطق زمانی و دوره‌های زمانی در اختیار ما قرار داده است.

۱. کلاس‌های اصلی تاریخ

  • LocalDate: فقط تاریخ (سال، ماه، روز).
  • LocalTime: فقط زمان (ساعت، دقیقه، ثانیه، نانوثانیه).
  • LocalDateTime: هر دو (تاریخ و زمان).
  • ZonedDateTime: تاریخ و زمان به همراه منطقه زمانی (Time Zone).

۲. نمایش زمان فعلی 🚀

برای دریافت زمانِ همین لحظه، از متد استاتیک now() استفاده می‌کنیم:

{code_block('import java.time.LocalDate;\n\nLocalDate today = LocalDate.now();\nSystem.out.println(today); // خروجی: 2024-12-25')}

۳. فرمت‌بندی تاریخ (DateTimeFormatter)

خروجی پیش‌فرض جاوا (ISO_DATE) همیشه برای کاربر پسند نیست. با DateTimeFormatter می‌توانید ظاهر تاریخ را تغییر دهید:

{code_block('import java.time.format.DateTimeFormatter;\n\nDateTimeFormatter fmt = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss");\nString formatted = myDateObj.format(fmt);')}
الگوهای رایج: - yyyy-MM-dd (2024-12-25) - dd/MM/yyyy (25/12/2024) - E, MMM dd yyyy (Wed, Dec 25 2024)

چرا java.time؟

کلاس‌های قدیمی (مثل java.util.Date) دارای مشکلات طراحیِ زیادی بودند و Mutable (تغییرپذیر) بودند که باعث باگ‌های احمقانه می‌شد. کلاس‌های جدید در جاوا 8 به بعد Immutable (تغییرناپذیر) هستند؛ یعنی هر تغییر، یک شیء جدید می‌سازد که بسیار ایمن‌تر است.

نکته مهندسی: همیشه در دیتابیس زمان را به صورت UTC ذخیره کنید و فقط در لایه نمایش به کاربر (Frontend)، آن را به منطقه زمانی محلی تبدیل کنید.
<hr style="margin: 50px 0; border: 0; border-top: 1px dashed rgba(255,255,255,0.1);">

بخش تخصصی: مهندسی داده و بازدهی در جاوا ⚙️💎

در این بخش، به مفاهیمی می‌پردازیم که برای نوشتن برنامه‌های مقیاس‌پذیر و با کارایی بالا (High Performance) ضروری هستند.

۱. تحلیل پیچیدگی زمانی (Big O Notation)

انتخاب کالکشنِ اشتباه می‌تواند سرعت برنامه شما را از میلی‌ثانیه به دقیقه کاهش دهد. مثلاً پر کردن یک ArrayList با ۱ میلیون داده در صورتی که مدام از ابتدای آن حذف کنید، فاجعه‌بار است (O(n)). در حالی که LinkedList این کار را در زمان ثابت (O(1)) انجام می‌دهد. همیشه قبل از انتخاب ابزار، به نحوه دسترسی و تغییر داده‌ها فکر کنید.

۲. مدیریت حافظه (Memory Overhead)

اشیاءِ کالکشن در جاوا "ارزان" نیستند. یک HashMap یا LinkedList به ازای هر گره (Node) مقدار زیادی حافظه اضافی (Overhead) برای نگهداری ریفرنس‌های داخلی مصرف می‌کند. در سیستم‌هایی با رم محدود، گاهی اوقات استفاده از یک آرایه ساده یا کالکشن‌های تخصصیِ Primitive (مثل آنچه در کتابخانه‌های Trove یا FastUtil یافت می‌شود) گزینه‌ی بهتری است.

۳. امنیت نخ (Thread Safety) و کالکشن‌ها

اکثر کالکشن‌های پایه در جاوا (مثل ArrayList و HashMap) Thread-Safe نیستند. یعنی اگر دو نخ (Thread) همزمان سعی کنند در آن‌ها بنویسند، برنامه کراش می‌کند یا داده‌ها خراب می‌شوند. برای محیط‌های چندنخی، باید از ConcurrentHashMap یا کلاس‌های کمکی در Collections.synchronizedList استفاده کرد.

نکته طلایی: در جاوا، همیشه سعی کنید "نوعِ متغیر" را اینترفیس بگیرید و "نوعِ پیاده‌سازی" را کلاس واقعی. مثلاً: List<String> list = new ArrayList<>();. این کار تعویضِ پیاده‌سازی را در آینده بسیار راحت می‌کند.

تمرین‌های عملی

برای تثبیت یادگیری این درس تمرین‌های زیر را حل کنید

دریافت تاریخ امروز Easy
سوال تمرین

با استفاده از کلاس LocalDate، تاریخ فعلی سیستم را در متغیری به نام today ذخیره و چاپ کنید. نام پکیج لازم را هم import کنید.

پاسخ تمرین
JAVA
import java.time.LocalDate;

public class Main {
  public static void main(String[] args) {
    LocalDate today = LocalDate.now();
    System.out.println(today);
  }
}

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.