Java Language
日付クラス
サーチ…
構文
-
Date object = new Date();
-
Date object = new Date(long date);
パラメーター
パラメータ | 説明 |
---|---|
パラメータなし | 割り当て時間(最も近いミリ秒)を使用して新しいDateオブジェクトを作成します。 |
長い日付 | "The epoch"(1970年1月1日、00:00:00 GMT)以降のミリ秒数に設定された時間で新しいDateオブジェクトを作成します。 |
備考
表現
内部的には、Java Dateオブジェクトはlongとして表されます。特定の時間( エポックと呼ばれる)からのミリ秒数です。元のJava Dateクラスにはタイムゾーンなどを扱うメソッドがありましたが、これらは新しいCalendarクラスの代わりに廃止されました。
したがって、あなたのコード内でやりたいことが特定の時間を表している場合は、Dateクラスを作成して保存することができます。ただし、人間が判読できるバージョンの日付を出力する場合は、Calendarクラスを作成します時間、分、秒、曜日、時間帯などを作成するには、その書式設定を使用します。特定のミリ秒は、異なる時間帯で異なる時間として表示されます。通常は "ローカル"のタイムゾーンに表示するが、フォーマット方法では、他のいくつかのタイムゾーンで表示する必要があることを考慮する必要があります。
また、JVMで使用されるクロックの精度は通常ミリ秒ではないことに注意してください。クロックは10ミリ秒ごとに「ティック」するだけなので、タイミングをとるとそのレベルで正確に物事を測定することに頼ることはできません。
インポートステートメント
import java.util.Date;
Date
クラスは、 java.util
パッケージからインポートできます。
あぶない
Date
インスタンスは変更可能であるため、それらを使用するとスレッドセーフなコードを書くことが困難になり、誤って内部状態への書き込みアクセスを提供する可能性があります。たとえば、以下のクラスでgetDate()
メソッドを使用すると、呼び出し元はトランザクションの日付を変更できます。
public final class Transaction {
private final Date date;
public Date getTransactionDate() {
return date;
}
}
解決策は、 date
フィールドのコピーを返すか、Java 8で導入されたjava.time
の新しいAPIを使用することです。
Date
クラスのほとんどのコンストラクタメソッドは廃止されており、使用すべきではありません。ほとんどの場合、日付操作にはCalendar
クラスを使用することをお勧めします。
Java 8
Javaの8は、パッケージに新しい時刻と日付のAPIを紹介しjava.time
含め、 LOCALDATEとにLocalTime 。 java.time
パッケージ内のクラスは、使いやすくなったオーバーホールされたAPIを提供します。 Java 8に書き込む場合は、この新しいAPIを使用することを強くお勧めします。 日付と時刻(java.time。*)を参照してください。
Dateオブジェクトの作成
Date date = new Date();
System.out.println(date); // Thu Feb 25 05:03:59 IST 2016
このDate
オブジェクトには、このオブジェクトが作成された現在の日付と時刻が含まれます。
Calendar calendar = Calendar.getInstance();
calendar.set(90, Calendar.DECEMBER, 11);
Date myBirthDate = calendar.getTime();
System.out.println(myBirthDate); // Mon Dec 31 00:00:00 IST 1990
Date
オブジェクトは、データコンストラクタの使用が廃止予定で推奨されていないため、 Calendar
インスタンスを通じて作成するのが最適です。これを行うには、FactoryメソッドからCalendar
クラスのインスタンスを取得する必要があります。次に、数字を使用して年、月、日を設定できます。また、カレンダークラスで提供される定数の場合は、読みやすさを向上させ、エラーを減らすことができます。
calendar.set(90, Calendar.DECEMBER, 11, 8, 32, 35);
Date myBirthDatenTime = calendar.getTime();
System.out.println(myBirthDatenTime); // Mon Dec 31 08:32:35 IST 1990
日付とともに、時間、分、秒の順に時間を渡すこともできます。
Dateオブジェクトの比較
カレンダー、日付、ローカル日付
before、after、compareToおよびequalsメソッド
//Use of Calendar and Date objects
final Date today = new Date();
final Calendar calendar = Calendar.getInstance();
calendar.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date birthdate = calendar.getTime();
final Calendar calendar2 = Calendar.getInstance();
calendar2.set(1990, Calendar.NOVEMBER, 1, 0, 0, 0);
Date samebirthdate = calendar2.getTime();
//Before example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.before(birthdate)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", today, today, Boolean.valueOf(today.before(today)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.before(today)));
//After example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(birthdate)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.after(today)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", today, birthdate, Boolean.valueOf(birthdate.after(today)));
//Compare example
System.out.printf("Compare %1$tF to %2$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(birthdate)));
System.out.printf("Compare %1$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(today.compareTo(today)));
System.out.printf("Compare %2$tF to %1$tF: %3$d%n", today, birthdate, Integer.valueOf(birthdate.compareTo(today)));
//Equal example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", today, birthdate, Boolean.valueOf(today.equals(birthdate)));
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
System.out.printf(
"Because birthdate.getTime() -> %1$d is different from samebirthdate.getTime() -> %2$d, there are millisecondes!%n",
Long.valueOf(birthdate.getTime()), Long.valueOf(samebirthdate.getTime()));
//Clear ms from calendars
calendar.clear(Calendar.MILLISECOND);
calendar2.clear(Calendar.MILLISECOND);
birthdate = calendar.getTime();
samebirthdate = calendar2.getTime();
System.out.printf("Is %1$tF equal to %2$tF after clearing ms? %3$b%n", birthdate, samebirthdate,
Boolean.valueOf(birthdate.equals(samebirthdate)));
isBefore、isAfter、compareToおよびequalsメソッド
//Use of LocalDate
final LocalDate now = LocalDate.now();
final LocalDate birthdate2 = LocalDate.of(2012, 6, 30);
final LocalDate birthdate3 = LocalDate.of(2012, 6, 30);
//Hours, minutes, second and nanoOfsecond can also be configured with an other class LocalDateTime
//LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
//isBefore example
System.out.printf("Is %1$tF before %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(birthdate2)));
System.out.printf("Is %1$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isBefore(now)));
System.out.printf("Is %2$tF before %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isBefore(now)));
//isAfter example
System.out.printf("Is %1$tF after %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(birthdate2)));
System.out.printf("Is %1$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isAfter(now)));
System.out.printf("Is %2$tF after %1$tF? %3$b%n", now, birthdate2, Boolean.valueOf(birthdate2.isAfter(now)));
//compareTo example
System.out.printf("Compare %1$tF to %2$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(birthdate2)));
System.out.printf("Compare %1$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(now.compareTo(now)));
System.out.printf("Compare %2$tF to %1$tF %3$d%n", now, birthdate2, Integer.valueOf(birthdate2.compareTo(now)));
//equals example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.equals(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.equals(birthdate3)));
//isEqual example
System.out.printf("Is %1$tF equal to %2$tF? %3$b%n", now, birthdate2, Boolean.valueOf(now.isEqual(birthdate2)));
System.out.printf("Is %1$tF to %2$tF? %3$b%n", birthdate2, birthdate3, Boolean.valueOf(birthdate2.isEqual(birthdate3)));
Java 8より前の日付比較
Javaの8の前に、日付を使用して比較することができjava.util.Calendarのとjava.util.Dateクラスを。日付クラスは日付を比較する4つのメソッドを提供します:
after
、 before
、 compareTo
およびequals
メソッドは、各日付のgetTime()メソッドによって返された値を比較します。
compareTo
メソッドは正の整数を返します。
- 0より大きい値:DateがDate引数の後にある場合
- 0より大きい値:DateがDate引数の前にある場合
- 値が0の場合:DateがDate引数と等しい場合
equals
例に示すように、明示的に与えられていない場合の値は、ミリ秒のように、同じ値で初期化されていないため、結果は驚くべきであることができます。
Java 8以降
Java 8では、Dateを操作する新しいObjectはjava.time.LocalDateで利用できます。 LocalDate
実装ChronoLocalDate 、年表、またはカレンダーシステムは、プラグイン可能である日付の抽象表現。
日付精度の精度を得るためには、Object java.time.LocalDateTimeを使用する必要があります。 LocalDate
とLocalDateTime
は同じメソッド名を比較に使用します。
LocalDate
を使用して日付を比較することは、 LocalDate
を使用するLocalDate
とは異なりChronoLocalDate
なぜなら、年表やカレンダーシステムは最初のものを考慮に入れていないからです。
ほとんどのアプリケーションでLocalDate
を使用する必要があるため、 ChronoLocalDate
は例には含まれていません。 ここでさらに読む。
ほとんどのアプリケーションでは、この[ChronoLocalDate]インターフェイスではなく、メソッドシグネチャ、フィールドおよび変数をLocalDateとして宣言する必要があります。
LocalDate
は、日付を比較する5つのメソッドがあります。
- isAfter(ChronoLocalDateその他)
- isBefore(ChronoLocalDateその他)
- isEqual(ChronoLocalDateその他)
- compareTo(ChronoLocalDateその他)
- equals(Object obj)
LocalDate
パラメータの場合、 isAfter
、 isBefore
、 isEqual
、 equals
、およびcompareTo
は、このメソッドを使用します。
int compareTo0(LocalDate otherDate) {
int cmp = (year - otherDate.year);
if (cmp == 0) {
cmp = (month - otherDate.month);
if (cmp == 0) {
cmp = (day - otherDate.day);
}
}
return cmp;
}
isEqual
直接compareTo0
を呼び出すのに対し、パラメータ参照が日付に最初に等しい場合equals
メソッドのチェックにequals
。
ChronoLocalDate
他のクラスのインスタンスのChronoLocalDate
、日付はEpoch Day
を使用して比較されます。エポック日数は、0日が1970-01-01(ISO)の単純な増分カウントです。
日付を特定の文字列形式に変換する
SimpleDateFormat
クラスのformat()
は、指定されたパターン文字列を使用して、 Date
オブジェクトを特定のフォーマットのString
オブジェクトに変換するのに役立ちます 。
Date today = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yy"); //pattern is specified here
System.out.println(dateFormat.format(today)); //25-Feb-16
applyPattern()
を使用すると、パターンを再度適用できます。
dateFormat.applyPattern("dd-MM-yyyy");
System.out.println(dateFormat.format(today)); //25-02-2016
dateFormat.applyPattern("dd-MM-yyyy HH:mm:ss E");
System.out.println(dateFormat.format(today)); //25-02-2016 06:14:33 Thu
注:ここで、 mm
(小文字のm)は分を表し、 MM
(大文字のM)は月を表します。小文字の "y"( y
)は年を表し、大文字の "Y"( Y
)は "今年の週"を表します。
文字列を日付に変換する
SimpleDateFormat
クラスのparse()
は、 String
パターンをDate
オブジェクトに変換するのに役立ちます。
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT, Locale.US);
String dateStr = "02/25/2016"; // input String
Date date = dateFormat.parse(dateStr);
System.out.println(date.getYear()); // 116
テキスト形式には4つの異なるスタイルがあり、 SHORT
、 MEDIUM
(これがデフォルト)、 LONG
とFULL
(すべてロケールに依存します)。ロケールが指定されていない場合、システムのデフォルトロケールが使用されます。
スタイル | Locale.US | Locale.France |
---|---|---|
ショート | 6/30/09 | 30/06/09 |
中 | 2009年6月30日 | 2009年6月30日 |
長いです | 2009年6月30日 | 2009年6月30日 |
FULL | 2009年6月30日火曜日 | mardi 2009年6月30日 |
基本的な日付出力
文字列yyyy/MM/dd hh:mm.ss
の形式で次のコードを使用すると、次の出力が表示されます。
2016/04/19 11:45.36
// define the format to use
String formatString = "yyyy/MM/dd hh:mm.ss";
// get a current date object
Date date = Calendar.getInstance().getTime();
// create the formatter
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatString);
// format the date
String formattedDate = simpleDateFormat.format(date);
// print it
System.out.println(formattedDate);
// single-line version of all above code
System.out.println(new SimpleDateFormat("yyyy/MM/dd hh:mm.ss").format(Calendar.getInstance().getTime()));
日付の書式付き文字列表現をDateオブジェクトに変換する
このメソッドを使用すると、日付の書式設定された文字列表現をDate
オブジェクトに変換できます。
/**
* Parses the date using the given format.
*
* @param formattedDate the formatted date string
* @param dateFormat the date format which was used to create the string.
* @return the date
*/
public static Date parseDate(String formattedDate, String dateFormat) {
Date date = null;
SimpleDateFormat objDf = new SimpleDateFormat(dateFormat);
try {
date = objDf.parse(formattedDate);
} catch (ParseException e) {
// Do what ever needs to be done with exception.
}
return date;
}
特定の日付の作成
JavaのDateクラスにはいくつかのコンストラクタがありますが、ほとんどのものは廃止予定です。 Dateインスタンスを直接作成するための唯一の受け入れ可能な方法は、空のコンストラクタを使用するか、long(標準ベース時間からミリ秒数)を渡すことです。現在の日付を探している場合や、別のDateインスタンスを既に持っている場合を除き、どちらも便利です。
新しい日付を作成するには、Calendarインスタンスが必要です。そこから、Calendarインスタンスを必要な日付に設定できます。
Calendar c = Calendar.getInstance();
現在の時刻に設定された新しいCalendarインスタンスを返します。カレンダーには、日付と時刻を変更する方法や、完全に設定する方法があります。この場合は、特定の日付に設定します。
c.set(1974, 6, 2, 8, 0, 0);
Date d = c.getTime();
getTime
メソッドは、必要なDateインスタンスを返します。カレンダーセットメソッドは1つ以上のフィールドのみを設定し、それらはすべて設定しないことに注意してください。つまり、年を設定すると、他のフィールドは変更されません。
落とし穴
多くの場合、このコードスニペットは目的を果たしますが、日付/時刻の2つの重要な部分は定義されていないことに注意してください。
-
(1974, 6, 2, 8, 0, 0)
1974,6,2,8,0,0(1974, 6, 2, 8, 0, 0)
パラメータは、デフォルトのタイムゾーン内で解釈され、別の場所で定義され、 - ミリ秒はゼロに設定されず、カレンダーインスタンスの作成時にシステムクロックから入力されます。
Java 8のLocalDateオブジェクトとLocalDateTimeオブジェクト
Dateオブジェクトは特定の曜日と時刻の両方を表すため、DateオブジェクトとLocalDateオブジェクトは 正確には変換できません 。LocalDateオブジェクトには時間またはタイムゾーン情報が含まれていません。ただし、時間情報ではなく実際の日付情報のみを気にする場合は、2つの間で変換すると便利です。
LocalDateを作成します。
// Create a default date
LocalDate lDate = LocalDate.now();
// Creates a date from values
lDate = LocalDate.of(2017, 12, 15);
// create a date from string
lDate = LocalDate.parse("2017-12-15");
// creates a date from zone
LocalDate.now(ZoneId.systemDefault());
LocalDateTimeを作成します。
// Create a default date time
LocalDateTime lDateTime = LocalDateTime.now();
// Creates a date time from values
lDateTime = LocalDateTime.of(2017, 12, 15, 11, 30);
// create a date time from string
lDateTime = LocalDateTime.parse("2017-12-05T11:30:30");
// create a date time from zone
LocalDateTime.now(ZoneId.systemDefault());
LocalDate to Dateおよびその逆
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDate
LocalDate localDate = date.toInstant().atZone(defaultZoneId).toLocalDate();
// LocalDate to Date
Date.from(localDate.atStartOfDay(defaultZoneId).toInstant());
LocalDateTimeをDateに、またはその逆にします。
Date date = Date.from(Instant.now());
ZoneId defaultZoneId = ZoneId.systemDefault();
// Date to LocalDateTime
LocalDateTime localDateTime = date.toInstant().atZone(defaultZoneId).toLocalDateTime();
// LocalDateTime to Date
Date out = Date.from(localDateTime.atZone(defaultZoneId).toInstant());
タイムゾーンとjava.util.Date
java.util.Date
オブジェクトにはタイムゾーンの概念がありません 。
- 日付のタイムゾーンを設定する方法はありません
- Dateオブジェクトのタイムゾーンを変更する方法はありません
-
new Date()
デフォルトコンストラクタで作成されたDateオブジェクトは、システムのデフォルトタイムゾーンの現在の時刻で初期化されます
ただし、 java.text.SimpleDateFormat
を使用すると、Dateオブジェクトで記述された特定の時刻で表される日付を別のタイムゾーンに表示することができます。
Date date = new Date();
//print default time zone
System.out.println(TimeZone.getDefault().getDisplayName());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //note: time zone not in format!
//print date in the original time zone
System.out.println(sdf.format(date));
//current time in London
sdf.setTimeZone(TimeZone.getTimeZone("Europe/London"));
System.out.println(sdf.format(date));
出力:
Central European Time
2016-07-21 22:50:56
2016-07-21 21:50:56
java.util.Dateをjava.sql.Dateに変換する
通常、 java.util.Date
からjava.sql.Date
への変換は、Dateオブジェクトをデータベースに書き込む必要がある場合に必要です。
java.sql.Date
はミリ秒単位のラッパーで、 JDBC
によってSQL DATE
型を識別するために使用されJDBC
次の例では、 java.util.Date()
コンストラクタを使用して、Dateオブジェクトを作成し、それを初期化して最も近いミリ秒までの時間を表します。この日付は、 java.sql.Date
オブジェクトを返すconvert(java.util.Date utilDate)
メソッドで使用されます。
例
public class UtilToSqlConversion {
public static void main(String args[])
{
java.util.Date utilDate = new java.util.Date();
System.out.println("java.util.Date is : " + utilDate);
java.sql.Date sqlDate = convert(utilDate);
System.out.println("java.sql.Date is : " + sqlDate);
DateFormat df = new SimpleDateFormat("dd/MM/YYYY - hh:mm:ss");
System.out.println("dateFormated date is : " + df.format(utilDate));
}
private static java.sql.Date convert(java.util.Date uDate) {
java.sql.Date sDate = new java.sql.Date(uDate.getTime());
return sDate;
}
}
出力
java.util.Date is : Fri Jul 22 14:40:35 IST 2016
java.sql.Date is : 2016-07-22
dateFormated date is : 22/07/2016 - 02:40:35
java.util.Date
は日付と時刻の両方の情報がありjava.sql.Date
が、 java.sql.Date
は日付情報しかありません
現地時間
Dateの時間部分だけを使用するには、LocalTimeを使用します。いくつかの方法でLocalTimeオブジェクトをインスタンス化できます
-
LocalTime time = LocalTime.now();
-
time = LocalTime.MIDNIGHT;
-
time = LocalTime.NOON;
-
time = LocalTime.of(12, 12, 45);
LocalTime
はtoStringメソッドが組み込まれているので、フォーマットを非常にうまく表示できます。
System.out.println(time);
LocalTimeオブジェクトから時間、分、秒、およびナノ秒を取得、加算、減算することもできます。
time.plusMinutes(1);
time.getMinutes();
time.minusMinutes(1);
次のコードを使用してDateオブジェクトに変換できます。
LocalTime lTime = LocalTime.now();
Instant instant = lTime.atDate(LocalDate.of(A_YEAR, A_MONTH, A_DAY)).
atZone(ZoneId.systemDefault()).toInstant();
Date time = Date.from(instant);
このクラスはアラームクラスをシミュレートするためのタイマークラス内で非常にうまく動作します。