【Java】日付時間操作を行う
本稿では日付時間の操作に関連した内容を記事にします。
ゲームでセーブファイル内に日付を埋め込みたい時などに使えるでしょう。
ゲームだけではなく一般業務でも必ずといっていいほど使用する分野なので最低限のことは出来るほうが良いのは言うまでもありません。
日付関連のクラス
日付時間には旧APIと新APIがあります。(※この記事では新APIを中心にサンプルコードを載せます。)
旧クラスには下記のようなものがあります。
Date
Date型は現在の日付時間を表すオブジェクトです。インスタンス化すると現在の日付時間を表すオブジェクトが作成されます。
旧クラスとは言っても企業のシステムは現在でも現役で使われているところが多いでしょう。
getTimeメソッドを利用するとオブジェクトが示す日付時間をミリ秒にして取得できます。
SimpleDateFormat
このクラスでは、日付を表すデータから文字列の日付時間に変換したり、逆に文字列からDate型に変換することができます。
現役でもよく使用されるクラスなので文字列からミリ秒、ミリ秒から文字列へ変換するサンプルを載せておきます。
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class Test { public static void main(String[] args) { //日付時間パターンを定義 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); try { //文字列を日付型に変換 Date date = sdf.parse("1999/11/21 12:21:45.987"); //ミリ秒に変換 long millis = date.getTime(); //1999/11/21 12:21:45.987のミリ秒を表示 System.out.println(millis); } catch (ParseException e) { e.printStackTrace(); } } }
943154505987
import java.text.SimpleDateFormat; import java.util.Date; public class Test { public static void main(String[] args) { //日付時間パターンを定義 SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS"); //現在時刻のミリ秒を取得 long millis = new Date().getTime(); //現在時刻の文字列をyyyy/MM/dd HH:mm:ss.SSS形式で取得 String datetimeText = sdf.format(millis); //現在時刻の文字列を表示 System.out.println(datetimeText); } }
2018/08/31 21:01:57.529
Calendar
Date型と同じく特定の日付時間を表すクラスですが、Date型よりもより細かい機能を利用できます。
例えば、現在の日付から数十分すすめたり、1月前の状態に戻したりできます。
また、曜日の取得なども出来るようになっています。
詳しくは公式APIをどうぞ。
Java1.8以降では新APIのほうを使用することをお勧めします。
新APIには主に下記のようなものがあります。
LocalDate
日付を表すオブジェクトです。
LocalTime
時間を表すオブジェクトです。
LocalDateTime
日付時間を表すオブジェクトであり、一日前や、一週間後の日付時間に移動させたりできます。
また、曜日の取得なども可能となっています。
ZonedDateTime
タイムゾーンを考慮した日付時間オブジェクトです。基本的にLocalDateTimeと同じようなことができるメソッドは用意されている模様
DateTimeFormatter
日付時間の書式を保持します。
Stringが表す日付とLocalDateTimeとの相互変換をするときに利用します。
現在のミリ秒を取得する
現在日時のミリ秒を取得する方法は何パターンかあるのですが、私は下記の方法を使用することがほとんどです。
他のパターンでのミリ秒取得は、このメソッドを元にしていることが多いです。
public class Test { public static void main(String[] args) { //現在時刻のミリ秒を取得 long time = System.currentTimeMillis(); //結果を表示 System.out.println(time); } }
1535890131902
現在の日付時間オブジェクトを取得する
LocalDateTimeクラスのnowメソッドで取得できます。タイムゾーンを考慮したい場合はZonedDateTimeを使用します。
import java.time.LocalDateTime; import java.time.ZonedDateTime; public class Test { public static void main(String[] args) { //現在時刻を取得 LocalDateTime time = LocalDateTime.now(); ZonedDateTime zonedTime = ZonedDateTime.now(); //結果を表示 System.out.println(time); System.out.println(zonedTime); } }
2018-09-02T21:12:29.588835600
2018-09-02T21:12:29.590835800+09:00[Asia/Tokyo]
年月日時分秒を指定して日付時間オブジェクトを取得する
年月日時分秒を指定する場合はofメソッドを使用します。
import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; public class Test { public static void main(String[] args) { //2000/11/11 11:11:11取得 LocalDateTime ldt = LocalDateTime.of(2000,11,11,11,11,11); //結果を表示 System.out.println(ldt); } }
2000-11-11T11:11:11
日付時間文字列から日付時間オブジェクトに変換する
DateTimeFormatter.ofPatternを使用して変換対象の書式を指定します。
y=年
M=月
d=日
H=時
m=分
s=秒
S=ミリ秒
となります。
これらを組み合わせてフォーマットを指定しましょう。ちなみにこれ以外のフォーマットもたくさんあります。詳しくはこちらをどうぞ。
変換処理はparseメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //日付時刻パターンの生成 DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS"); //パターンにあった文字列からLocalDateTimeオブジェクトの取得 LocalDateTime datetime = LocalDateTime.parse("2018/05/20 09:45:11.342", fmt); //日付時間を表示 System.out.println(datetime); } }
2018-05-20T09:45:11.342
日付時間オブジェクトから日付時間文字列に変換する
書式指定は日付時間文字列から日付時間オブジェクトへ変換する時と同じです。
変換にはformatメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //日付時刻パターンの生成 DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss.SSS"); //現在時刻をパターンの文字列に変換 String datetimeText = LocalDateTime.now().format(fmt); //日付時間を表示 System.out.println(datetimeText); } }
2018/09/02 21:37:32.848
年を取得する
getYearメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); int r = datetime.getYear(); //結果を表示 System.out.println(r); } }
2010
月を取得する
getMonthメソッドを使用します。ちなみにenum型でなく直で数値を取得するgetMonthValueも存在します。
import java.time.LocalDateTime; import java.time.Month; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); Month r = datetime.getMonth(); //結果を表示 System.out.println(r.getValue()); } }
10
日を取得する
getDayOfMonthメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); int r = datetime.getDayOfMonth(); //結果を表示 System.out.println(r); } }
20
時を取得する
getHourメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); int r = datetime.getHour(); //結果を表示 System.out.println(r); } }
5
分を取得する
getMinuteメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); int r = datetime.getMinute(); //結果を表示 System.out.println(r); } }
42
秒を取得する
getSecondメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); int r = datetime.getSecond(); //結果を表示 System.out.println(r); } }
31
指定日より後であるか判定する
isAfterメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); //2000/11/11 11:11:11より後の日時か boolean isAfter = datetime.isAfter(LocalDateTime.of(2000,11,11,11,11,11)); //結果を表示 System.out.println(isAfter); } }
true
指定日より前であるか判定する
isBeforeメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); //2000/11/11 11:11:11より前の日時か boolean isBefore = datetime.isBefore(LocalDateTime.of(2000,11,11,11,11,11)); //結果を表示 System.out.println(isBefore); } }
false
指定日の数日後を取得する
plusDaysメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); //10日後を取得 LocalDateTime dateAdd10 = datetime.plusDays(10); //結果を表示 System.out.println(dateAdd10); } }
2010-10-30T05:42:31
指定日の数日前を取得する
minusDaysメソッドを使用します。
import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { //特定の日時を取得 LocalDateTime datetime = LocalDateTime.parse("2010/10/20 05:42:31",DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss")); //15日前を取得 LocalDateTime dateSub15 = datetime.minusDays(15); //結果を表示 System.out.println(dateSub15); } }
2010-10-05T05:42:31
うるう年かどうか判定する
isLeapYearメソッドを使用します。
import java.time.LocalDateTime; public class Test { public static void main(String[] args) { //現在日時を取得 LocalDateTime datetime = LocalDateTime.now(); //今年はうるう年か boolean isLeapYear = datetime.toLocalDate().isLeapYear(); //結果を表示 System.out.println(isLeapYear); } }
false
指定の日付は何日後かを取得する
おまけで、指定の日付は何日後かを取得するサンプルを作ってみました。
今回の例では12月25日。つまり、クリスマスまで、あと何日なのかを計算するものとなります。
import java.time.LocalDate; import java.time.temporal.ChronoField; public class Test { public static void main(String[] args) { //現在でインスタンス生成 LocalDate now = LocalDate.now(); //年月日からインスタンス生成 LocalDate nextXmas = LocalDate.of(now.getYear(), 12, 25); //現在年でクリスマスを過ぎてるなら1年進める if ( now.isAfter(nextXmas) ) { //1年加算 nextXmas = nextXmas.plusYears(1L); } //日の差を取得 long result = nextXmas.getLong(ChronoField.EPOCH_DAY) - now.getLong(ChronoField.EPOCH_DAY); //結果を表示 if ( result == 0 ) { System.out.println("今日がクリスマスです。"); } else { System.out.println("次のクリスマスは"+result+"日後です。"); } } }
次のクリスマスは112日後です。
ここで使用したgetLongメソッドは引数のenum型に合わせて取得するデータを変更できます。enum定数値はChronoFieldで主に用意されています。詳細はこちらからどうぞ。
ディスカッション
コメント一覧
まだ、コメントがありません