شنبه ۲۹ دي ۱۴۰۳
Tut24 آموزش برنامه نویسی و مجله تخصصی فناوری ورود/عضویت

آموزش جاوا - تاریخ و زمان

جاوا کلاس Date را در بسته‌ی java.util فراهم می‌کند. این کلاس تاریخ و زمان فعلی را در خود نگهداری می‌کند.

کلاس Date دو سازنده را پشتیبانی می‌کند که در جدول زیر نشان داده شده‌اند.

شماره سازنده و توضیحات
1

Date( )

این سازنده شیء را با تاریخ و زمان فعلی مقداردهی اولیه می‌کند.

2

Date(long millisec)

این سازنده یک آرگومان را پذیرفته و برابر تعداد میلی‌ثانیه‌هایی است که از نیمه‌شب 1 ژانویه 1970 می‌گذرد، مقداردهی اولیه می‌کند.

متدهای کلاس تاریخ به شرح زیر هستند.

شماره متد و توضیحات
1

boolean after(Date date)

اگر شیء تاریخ فراخوانی کننده حاوی تاریخی است که بعدتر از تاریخ مشخص شده توسط date است، مقدار true برگردانده می‌شود؛ در غیر این صورت، false برگردانده می‌شود.

2

boolean before(Date date)

اگر شیء تاریخ فراخوانی کننده حاوی تاریخی است که قبل از تاریخ مشخص شده توسط date است، مقدار true برگردانده می‌شود؛ در غیر این صورت، false برگردانده می‌شود.

3

Object clone( )

شیء تاریخ فراخوانی کننده را کپی می‌کند.

4

int compareTo(Date date)

مقدار شیء فراخوانی کننده را با مقدار date مقایسه می‌کند. اگر مقادیر برابر باشند، مقدار 0 برگردانده می‌شود. اگر شیء فراخوانی کننده، قبل از date باشد، یک مقدار منفی برگردانده می‌شود. اگر شیء فراخوانی کننده، بعد از date باشد، یک مقدار مثبت برگردانده می‌شود.

5

int compareTo(Object obj)

اگر obj از کلاس Date باشد، به طور مشابهی به compareTo(Date) عمل می‌کند. در غیر این صورت، یک ClassCastException پرتاب می‌شود.

6

boolean equals(Object date)

اگر شیء تاریخ فراخوانی کننده همان زمان و تاریخ را که توسط date مشخص شده است حاوی باشد، مقدار true برگردانده می‌شود؛ در غیر این صورت، false برگردانده می‌شود.

7

long getTime( )

تعداد میلی‌ثانیه‌هایی را که از 1 ژانویه 1970 می‌گذرد برمی‌گرداند.

8

int hashCode( )

یک کد هش برای شیء فراخوانی کننده برمی‌گرداند.

9

void setTime(long time)

زمان و تاریخ را به طور مشخص شده توسط time که معادل یک زمان گذرانده شده به میلی‌ثانیه از نیمه‌شب 1 ژانویه 1970 است، تنظیم می‌کند.

10

String toString( )

شیء تاریخ فراخوانی کننده را به یک رشته تبدیل می‌کند و نتیجه را برمی‌گرداند.

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

این یک روش بسیار آسان برای دریافت تاریخ و زمان فعلی در جاوا است. می‌توانید از یک شیء ساده‌ی Date با متد toString() برای چاپ تاریخ و زمان فعلی استفاده کنید به شکل زیر −

مثال


import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date using toString()
      System.out.println(date.toString());
   }
}

این به نتیجه‌ی زیر منجر خواهد شد −

خروجی


on May 04 09:51:52 CDT 2009

مقایسه تاریخ

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

  • شما می‌توانید از getTime( ) برای دریافت تعداد میلی‌ثانیه‌هایی استفاده کنید که از 1 ژانویه 1970 می‌گذرد و سپس این مقادیر را با یکدیگر مقایسه کنید. (You can use getTime() to obtain the milliseconds that have elapsed since January 1, 1970 and then compare these values with each other.)

  • شما می‌توانید از متد compareTo( ) برای مقایسه دو تاریخ استفاده کنید. این متد یک عدد صحیح برمی‌گرداند که بر اساس نتیجه‌ی مقایسه مقادیر دو تاریخ تعیین می‌شود. (You can use the compareTo() method to compare two dates. This method returns an integer that determines the result of comparing the values of the two dates.)

  • شما می‌توانید از متدهای after( ) و before( ) برای بررسی تاریخ‌ها در ترتیب بعدی یا قبلی یکدیگر استفاده کنید. (You can use the after() and before() methods to check if dates are in a chronological order, either after or before each other.)

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


import java.util.*;
import java.text.*;

public class DateDemo {

   public static void main(String args[]) {
      Date dNow = new Date( );
      SimpleDateFormat ft = 
      new SimpleDateFormat ("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

      System.out.println("Current Date: " + ft.format(dNow));
   }
}

این کد نتیجه زیر را تولید می‌کند −

خروجی


Current Date: Sun 2004.07.18 at 04:14:09 PM PDT

کدهای فرمت SimpleDateFormat ساده

برای تعیین فرمت زمان، از یک رشته الگوی زمان استفاده کنید. در این الگو، تمام حروف ASCII به عنوان حروف الگو رزرو شده‌اند و به شکل زیر تعریف می‌شوند −

حرف توضیح مثال
G نمایشگر عصر/صبح (ق.ظ/ب.ظ) ب.ظ
y سال با چهار رقم 2001
M ماه در سال جولای یا 07
d روز در ماه 10
h ساعت در ظهر/عصر (1~12) 12
H ساعت در روز (0~23) 22
m دقیقه در ساعت 30
s ثانیه در دقیقه 55
S میلی‌ثانیه 234
E روز در هفته سه‌شنبه
D روز در سال 360
F روز هفته در ماه 2 (دومین چهارشنبه در جولای)
w هفته در سال 40
W هفته در ماه 1
a نشانگر صبح/عصر (ق.ظ/ب.ظ) ب.ظ
k ساعت در روز (1~24) 24
K ساعت در ظهر/عصر (0~11) 10
z منطقه زمانی Eastern Standard Time
' رفع اشکال برای متن Delimiter
" نقطه تک `

فرمت‌بندی تاریخ با استفاده از printf

فرمت‌بندی تاریخ و زمان به سادگی با استفاده از متد printf انجام می‌شود. شما از یک فرمت دو حرفی استفاده می‌کنید، با شروع با حرف t و پایان با یکی از حروف جدول همانند کد زیر است.

مثال


import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();

      // display time and date
      String str = String.format("Current Date/Time : %tc", date );

      System.out.printf(str);
   }
}

این عبارت نتیجه زیر را تولید می‌کند −

خروجی


Current Date/Time : Sat Dec 15 16:37:57 MST 2012

اگر بخواهید بارها تاریخ را برای فرمت‌بندی هر بخش وارد کنید، کمی احمقانه خواهد بود. به همین دلیل، یک رشته فرمت می‌تواند شاخص آرگومانی که باید فرمت شود را نشان دهد.

شاخص باید به‌طور مستقیم پس از % آمده و باید با $ خاتمه یابد.

مثال


import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display time and date
      System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
   }
}

این عبارت نتیجه زیر را تولید می‌کند −

خروجی


Due date: February 09, 2004

در صورت تمایل، می‌توانید از علامت < استفاده کنید. این علامت نشان می‌دهد که باید از همان آرگومانی که در قالب فرمت قبلی استفاده شده، دوباره استفاده شود.

مثال


import java.util.Date;
public class DateDemo {

   public static void main(String args[]) {
      // Instantiate a Date object
      Date date = new Date();
  
      // display formatted date
      System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
   }
}

این عبارت نتیجه زیر را تولید می‌کند −

خروجی


Due date: February 09, 2004

کاراکترهای تبدیل تاریخ و زمان

کاراکتر توضیحات مثال
c تاریخ و زمان کامل دوشنبه 04 مه 09:51:52 CDT 2009
F تاریخ ISO 8601 2004-02-09
D تاریخ فرمت آمریکایی (ماه/روز/سال) 02/09/2004
T زمان 24 ساعتی 18:05:19
r زمان 12 ساعتی 06:05:19 pm
R زمان 24 ساعتی بدون ثانیه 18:05
Y سال چهار رقمی (با صفرهای اولیه) 2004
y دو رقم آخر سال (با صفرهای اولیه) 04
C دو رقم اول سال (با صفرهای اولیه) 20
B نام کامل ماه فوریه
b نام کوتاه ماه فور
m ماه دو رقمی (با صفرهای اولیه) 02
d روز دو رقمی (با صفرهای اولیه) 03
e روز دو رقمی (بدون صفرهای اولیه) 9
A نام کامل روز هفته دوشنبه
a نام کوتاه روز هفته دو
j روز سال سه رقمی (با صفرهای اولیه) 069
H ساعت دو رقمی (با صفرهای اولیه)، بین 00 و 23 18
k ساعت دو رقمی (بدون صفرهای اولیه)، بین 0 و 23 18
I ساعت دو رقمی (با صفرهای اولیه)، بین 01 و 12 06
l ساعت دو رقمی (بدون صفرهای اولیه)، بین 1 و 12 6
M دقیقه دو رقمی (با صفرهای اولیه) 05
S ثانیه دو رقمی (با صفرهای اولیه) 19
L میلی ثانیه سه رقمی (با صفرهای اولیه) 047
N نانو ثانیه نه رقمی (با صفرهای اولیه) 047000000
P نشانگر صبح یا عصر بزرگ (با حروف بزرگ) ب.ظ.
p نشانگر صبح یا عصر کوچک (با حروف کوچک) ب.ظ.
z اختلاف عددی RFC 822 از GMT -0800
Z منطقه زمانی PST
s ثانیه‌ها از 1970-01-01 00:00:00 GMT 1078884319
Q میلی ثانیه‌ها از 1970-01-01 00:00:00 GMT 1078884319047

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

تجزیه رشته‌ها به تاریخ‌ها

کلاس SimpleDateFormat متدهای اضافی دیگری دارد، به ویژه متد parse() که سعی می‌کند یک رشته را بر اساس فرمت ذخیره شده در شیء SimpleDateFormat داده شده تجزیه کند.

مثال


import java.util.*;
import java.text.*;
  
public class DateDemo {

   public static void main(String args[]) {
      SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd"); 
      String input = args.length == 0 ? "1818-11-11" : args[0]; 

      System.out.print(input + " Parses as "); 
      Date t;
      try {
         t = ft.parse(input); 
         System.out.println(t); 
      } catch (ParseException e) { 
         System.out.println("Unparseable using " + ft); 
      }
   }
}

اجرای نمونه‌ای از برنامه فوق نتیجه زیر را تولید خواهد کرد −

نتیجه


1818-11-11 Parses as Wed Nov 11 00:00:00 EST 1818

خوابیدن برای مدتی

شما می‌توانید برای هر بازه‌ی زمانی از یک میلی‌ثانیه تا عمر کامپیوتر خودتان بخوابید. به عنوان مثال، برنامه‌ی زیر برای ۳ ثانیه خواب می‌کند −

مثال


import java.util.*;
public class SleepDemo {

   public static void main(String args[]) {
      try { 
         System.out.println(new Date( ) + "\n"); 
         Thread.sleep(5*60*10); 
         System.out.println(new Date( ) + "\n"); 
      } catch (Exception e) {
         System.out.println("Got an exception!"); 
      }
   }
}

این عمل موجب تولید نتیجه‌ی زیر می‌شود −

خروجی


Sun May 03 18:04:41 GMT 2009
Sun May 03 18:04:51 GMT 2009

اندازه‌گیری زمان گذشته

گاهی اوقات، شما ممکن است نیاز داشته باشید تا زمان را به میلی‌ثانیه اندازه‌گیری کنید. بنابراین، بیایید مثال بالا را دوباره بنویسیم −

مثال


import java.util.*;
public class DiffDemo {

   public static void main(String args[]) {
      try {
         long start = System.currentTimeMillis( );
         System.out.println(new Date( ) + "\n");
         
         Thread.sleep(5*60*10);
         System.out.println(new Date( ) + "\n");
         
         long end = System.currentTimeMillis( );
         long diff = end - start;
         System.out.println("Difference is : " + diff);
      } catch (Exception e) {
         System.out.println("Got an exception!");
      }
   }
}

این به نتیجه زیر منجر خواهد شد −

خروجی


Sun May 03 18:16:51 GMT 2009
Sun May 03 18:16:57 GMT 2009
Difference is : 5993

کلاس GregorianCalendar

GregorianCalendar یک پیاده‌سازی محسوب می‌شود برای کلاس تقویم که تقویم گریگوری را با تقویمی که با آن آشنایی دارید، پیاده‌سازی می‌کند. ما در این آموزش درباره کلاس تقویم بحث نکردیم، شما می‌توانید در مستندات استاندارد جاوا به این مورد مراجعه کنید.

متد getInstance( ) از کلاس Calendar یک GregorianCalendar را با استفاده از تاریخ و زمان فعلی در محلیت و منطقه زمانی پیش فرض برمی‌گرداند. GregorianCalendar دو فیلد AD و BC را تعریف می‌کند که نمایانگر دو عصر تعریف شده توسط تقویم گریگوری هستند.

همچنین چندین سازنده برای اشیاء GregorianCalendar وجود دارد −

شماره سازنده و توضیحات
1

GregorianCalendar()

یک GregorianCalendar پیش‌فرض را با استفاده از زمان فعلی در منطقه زمانی پیش‌فرض و محلیت پیش‌فرض ایجاد می‌کند.

2

GregorianCalendar(int year, int month, int date)

یک GregorianCalendar با تاریخ داده شده در منطقه زمانی پیش‌فرض و محلیت پیش‌فرض ایجاد می‌کند.

3

GregorianCalendar(int year, int month, int date, int hour, int minute)

یک GregorianCalendar با تاریخ و زمان داده شده در منطقه زمانی پیش‌فرض و محلیت پیش‌فرض ایجاد می‌کند.

4

GregorianCalendar(int year, int month, int date, int hour, int minute, int second)

یک GregorianCalendar با تاریخ و زمان داده شده در منطقه زمانی پیش‌فرض و محلیت پیش‌فرض ایجاد می‌کند.

5

GregorianCalendar(Locale aLocale)

یک GregorianCalendar بر اساس زمان فعلی در منطقه زمانی پیش‌فرض و محلیت داده شده ایجاد می‌کند.

6

GregorianCalendar(TimeZone zone)

یک GregorianCalendar بر اساس زمان فعلی در منطقه زمانی داده شده و محلیت پیش‌فرض ایجاد می‌کند.

7

GregorianCalendar(TimeZone zone, Locale aLocale)

یک GregorianCalendar بر اساس زمان فعلی در منطقه زمانی و محلیت داده شده ایجاد می‌کند.

شماره متد و توضیحات
1

void add(int field, int amount)

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

2

protected void computeFields()

زمان UTC به صورت میلی‌ثانیه را به مقادیر فیلدهای زمان تبدیل می‌کند.

3

protected void computeTime()

مقادیر فیلدهای زمان را به صورت میلی‌ثانیه UTC تبدیل می‌کند (تابع override شده از Calendar).

4

boolean equals(Object obj)

این GregorianCalendar را با یک ارجاع شیء مقایسه می‌کند.

5

int get(int field)

مقدار برای فیلد زمانی داده شده را برمی‌گرداند.

6

int getActualMaximum(int field)

بیشترین مقداری که این فیلد می‌تواند داشته باشد را برمی‌گرداند، با توجه به تاریخ فعلی.

7

int getActualMinimum(int field)

کمترین مقداری که این فیلد می‌تواند داشته باشد را برمی‌گرداند، با توجه به تاریخ فعلی.

8

int getGreatestMinimum(int field)

بیشترین مقدار حداقل برای فیلد داده شده را برمی‌گرداند اگر متغیر باشد.

9

Date getGregorianChange()

تاریخ تغییر تقویم گریگوری را برمی‌گرداند.

10

int getLeastMaximum(int field)

کمترین مقدار بیشینه برای فیلد داده شده را برمی‌گرداند اگر متغیر باشد.

11

int getMaximum(int field)

مقدار بیشینه برای فیلد داده شده را برمی‌گرداند.

12

Date getTime()

زمان فعلی این تقویم را برمی‌گرداند.

13

long getTimeInMillis()

زمان فعلی این تقویم را به صورت یک عدد long برمی‌گرداند.

14

TimeZone getTimeZone()

منطقه زمانی را برمی‌گرداند.

15

int getMinimum(int field)

مقدار کمینه برای فیلد داده شده را برمی‌گرداند.

16

int hashCode()

تابع hashCode را override می‌کند.

17

boolean isLeapYear(int year)

تشخیص می‌دهد آیا سال داده شده سال کبیسه است یا خیر.

18

void roll(int field, boolean up)

یک واحد زمانی (به صورت بالا/پایین) به فیلد زمانی داده شده اضافه یا کم می‌کند، بدون تغییر بخش‌های بزرگتر.

19

void set(int field, int value)

فیلد زمانی را با مقدار داده شده تنظیم می‌کند.

20

void set(int year, int month, int date)

مقادیر سال، ماه و روز را تنظیم می‌کند.

21

void set(int year, int month, int date, int hour, int minute)

مقادیر سال، ماه، روز، ساعت و دقیقه را تنظیم می‌کند.

22

void set(int year, int month, int date, int hour, int minute, int second)

مقادیر سال، ماه، روز، ساعت، دقیقه و ثانیه را تنظیم می‌کند.

23

void setGregorianChange(Date date)

تاریخ تغییر تقویم گریگوری را تنظیم می‌کند.

24

void setTime(Date date)

زمان فعلی تقویم را با تاریخ داده شده تنظیم می‌کند.

25

void setTimeInMillis(long millis)

زمان فعلی تقویم را از مقدار long داده شده تنظیم می‌کند.

26

void setTimeZone(TimeZone value)

منطقه زمانی را با مقدار منطقه زمانی داده شده تنظیم می‌کند.

27

String toString()

نمایش رشته‌ای از این تقویم برمی‌گرداند.

لطفاً توجه داشته باشید که این فهرست متدها مربوط به نسخه‌ی مشخص GPT-3.5 است و ممکن است در نسخه‌های جدیدتر Java تغییر کرده باشد.

در ادامه لیستی از چندین متد پشتیبان مفید ارائه شده توسط کلاس GregorianCalendar آورده شده است −

مثال


import java.util.*;
public class GregorianCalendarDemo {

   public static void main(String args[]) {
      String months[] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", 
         "Oct", "Nov", "Dec"};
      
      int year;
      // Create a Gregorian calendar initialized
      // with the current date and time in the
      // default locale and timezone.
      
      GregorianCalendar gcalendar = new GregorianCalendar();
      
      // Display current time and date information.
      System.out.print("Date: ");
      System.out.print(months[gcalendar.get(Calendar.MONTH)]);
      System.out.print(" " + gcalendar.get(Calendar.DATE) + " ");
      System.out.println(year = gcalendar.get(Calendar.YEAR));
      System.out.print("Time: ");
      System.out.print(gcalendar.get(Calendar.HOUR) + ":");
      System.out.print(gcalendar.get(Calendar.MINUTE) + ":");
      System.out.println(gcalendar.get(Calendar.SECOND));

      // Test if the current year is a leap year
      if(gcalendar.isLeapYear(year)) {
         System.out.println("The current year is a leap year");
      }else {
         System.out.println("The current year is not a leap year");
      }
   }
}

این عمل، نتیجه‌ی زیر را تولید خواهد کرد −

خروجی


Date: Apr 22 2009
Time: 11:25:27
The current year is not a leap year