Java-date-time

提供:Dev Guides
移動先:案内検索

Java-日付と時刻

Javaは、 java.util パッケージで利用可能な Date クラスを提供します。このクラスは、現在の日付と時刻をカプセル化します。

Dateクラスは、次の表に示す2つのコンストラクターをサポートします。

Sr.No. Constructor & Description
1

Date( )

このコンストラクターは、現在の日付と時刻でオブジェクトを初期化します。

2

Date(long millisec)

このコンストラクターは、1970年1月1日の午前0時から経過したミリ秒数に等しい引数を受け入れます。

日付クラスのメソッドは次のとおりです。

Sr.No. Method & Description
1

boolean after(Date date)

呼び出したDateオブジェクトにdateで指定された日付よりも後の日付が含まれている場合はtrueを返し、それ以外の場合はfalseを返します。

2

boolean before(Date date)

呼び出したDateオブジェクトにdateで指定された日付よりも前の日付が含まれている場合はtrueを返し、それ以外の場合はfalseを返します。

3

Object clone( )

呼び出し日付オブジェクトを複製します。

4

int compareTo(Date date)

呼び出しオブジェクトの値と日付の値を比較します。 値が等しい場合は0を返します。 呼び出しオブジェクトが日付より前の場合、負の値を返します。 呼び出しオブジェクトが日付より後の場合、正の値を返します。

5

int compareTo(Object obj)

objがDateクラスの場合、compareTo(Date)と同じように動作します。 それ以外の場合、ClassCastExceptionがスローされます。

6

boolean equals(Object date)

呼び出したDateオブジェクトにdateで指定された日時と同じ日時が含まれる場合はtrueを返し、そうでない場合はfalseを返します。

7

long getTime( )

1970年1月1日から経過したミリ秒数を返します。

8

int hashCode( )

呼び出し元オブジェクトのハッシュコードを返します。

9

void setTime(long time)

1970年1月1日午前0時からの経過時間をミリ秒単位で表すtimeで指定された時刻と日付を設定します。

10

String toString( )

呼び出しDateオブジェクトを文字列に変換し、結果を返します。

現在の日付と時刻を取得する

これは、Javaで現在の日付と時刻を取得する非常に簡単な方法です。 次のように、現在の日付と時刻を出力するために、_toString()_メソッドで単純なDateオブジェクトを使用できます-

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

日付比較

以下は、2つの日付を比較する3つの方法です-

  • getTime()を使用して、両方のオブジェクトについて1970年1月1日の午前0時から経過したミリ秒数を取得し、これら2つの値を比較できます。
  • メソッドbefore()、after()、およびequals()を使用できます。 たとえば、月の12日は18日より前なので、new Date(99、2、12).before(new Date(99、2、18))はtrueを返します。
  • Comparableインターフェースによって定義され、Dateによって実装されるcompareTo()メソッドを使用できます。

SimpleDateFormatを使用した日付の書式設定

SimpleDateFormatは、ロケールに依存した方法で日付をフォーマットおよび解析するための具象クラスです。 SimpleDateFormatを使用すると、日時の書式設定にユーザー定義のパターンを選択することから開始できます。

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

単純なDateFormat形式コード

時間形式を指定するには、時間パターン文字列を使用します。 このパターンでは、すべてのASCII文字はパターン文字として予約されており、次のように定義されています-

Character Description Example
G Era designator AD
y Year in four digits 2001
M Month in year July or 07
d Day in month 10
h Hour in A.M./P.M. (1~12) 12
H Hour in day (0~23) 22
m Minute in hour 30
s Second in minute 55
S Millisecond 234
E Day in week Tuesday
D Day in year 360
F Day of week in month 2 (second Wed. in July)
w Week in year 40
W Week in month 1
a A.M./P.M. marker PM
k Hour in day (1~24) 24
K Hour in A.M./P.M. (0~11) 10
z Time zone Eastern Standard Time
' Escape for text Delimiter
" Single quote `

printfを使用した日付の書式設定

日付と時刻のフォーマットは、 printf メソッドを使用して非常に簡単に実行できます。 次のコードに示すように、 t で始まり、表の文字の1つで終わる2文字の形式を使用します。

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

日付と時刻の変換文字

Character Description Example
c Complete date and time Mon May 04 09:51:52 CDT 2009
F ISO 8601 date 2004-02-09
D U.S. formatted date (month/day/year) 02/09/2004
T 24-hour time 18:05:19
r 12-hour time 06:05:19 pm
R 24-hour time, no seconds 18:05
Y Four-digit year (with leading zeroes) 2004
y Last two digits of the year (with leading zeroes) 04
C First two digits of the year (with leading zeroes) 20
B Full month name February
b Abbreviated month name Feb
m Two-digit month (with leading zeroes) 02
d Two-digit day (with leading zeroes) 03
e Two-digit day (without leading zeroes) 9
A Full weekday name Monday
a Abbreviated weekday name Mon
j Three-digit day of year (with leading zeroes) 069
H Two-digit hour (with leading zeroes), between 00 and 23 18
k Two-digit hour (without leading zeroes), between 0 and 23 18
I Two-digit hour (with leading zeroes), between 01 and 12 06
l Two-digit hour (without leading zeroes), between 1 and 12 6
M Two-digit minutes (with leading zeroes) 05
S Two-digit seconds (with leading zeroes) 19
L Three-digit milliseconds (with leading zeroes) 047
N Nine-digit nanoseconds (with leading zeroes) 047000000
P Uppercase morning or afternoon marker PM
p Lowercase morning or afternoon marker pm
z RFC 822 numeric offset from GMT -0800
Z Time zone PST
s Seconds since 1970-01-01 00:00:00 GMT 1078884319
Q Milliseconds since 1970-01-01 00:00:00 GMT 1078884319047

日付と時刻に関連する他の便利なクラスがあります。 詳細については、Java Standardのドキュメントを参照できます。

文字列を日付に解析する

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

しばらく寝て

1ミリ秒からコンピューターの寿命までの任意の期間スリープできます。 たとえば、次のプログラムは3秒間スリープします-

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は、使い慣れた通常のグレゴリオ暦を実装するCalendarクラスの具体的な実装です。 このチュートリアルではCalendarクラスについては説明しませんでした。このための標準Javaドキュメントを参照できます。

Calendarの* getInstance()*メソッドは、デフォルトのロケールとタイムゾーンの現在の日付と時刻で初期化されたGregorianCalendarを返します。 GregorianCalendarは、ADとBCの2つのフィールドを定義します。 これらは、グレゴリオ暦で定義された2つの時代を表しています。

GregorianCalendarオブジェクトのいくつかのコンストラクタもあります-

Sr.No. Constructor & Description
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を構築します。

以下は、GregorianCalendarクラスによって提供されるいくつかの有用なサポートメソッドのリストです-

Sr.No. Method & Description
1

void add(int field, int amount)

カレンダーのルールに基づいて、指定された(署名された)時間を指定された時間フィールドに追加します。

2

protected void computeFields()

UTCをミリ秒として時間フィールド値に変換します。

3

protected void computeTime()

カレンダーをオーバーライド時間フィールド値をミリ秒としてUTCに変換します。

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をオーバーライドします。

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)

GregorianCalendarの変更日を設定します。

24

void setTime(Date date)

このカレンダーの現在の時刻を指定された日付に設定します。

25

void setTimeInMillis(long millis)

このカレンダーの現在時刻を、指定されたlong値から設定します。

26

void setTimeZone(TimeZone value)

指定されたタイムゾーン値でタイムゾーンを設定します。

27

String toString()

このカレンダーの文字列表現を返します。

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

Calendarクラスで使用可能な定数の完全なリストについては、標準のJavaドキュメントを参照できます。