SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

直近開催のイベントはこちら!

HRzine Day 2024 Winter

2024年2月1日(木)12:00~17:40

主要製品スペック一覧

人事業務の効率・確度・精度を高めるために欠かせないHRテクノロジー。その主な製品の機能を分野ごとに比較できる資料群です。製品検討の参考資料としてご活用ください。

人事労務管理システム<br>主要製品スペック一覧 2023

人事労務管理システム
主要製品スペック一覧 2023

その他のスペック一覧

タレントマネジメントシステム<br>主要製品スペック一覧 2023

タレントマネジメントシステム
主要製品スペック一覧 2023

採用管理システム<br>主要製品スペック一覧 2023

採用管理システム
主要製品スペック一覧 2023

みちこ先生のオラクル認定Javaプログラマ Silver SE 7/8 合格コース | 特別授業

【認定Java Silver】ここが変わった! OCJP Silver SE 8要点解説[前編] 〜 旧バージョン試験との違い・新出題Date and Time API


  • Facebook
  • Twitter
  • Pocket
  • note
  • hatena

本記事の目次本記事の目次 )

DateTimeFormatterの利用

先ほどのサンプル(Sample1.java)のparse()メソッドでは、テキスト文字列をもとに、目的の日付オブジェクトを取得できました。しかし、引数の文字列は注意が必要です。たとえば、7行目のparse()メソッドの引数を次のように修正したとします。

Sample1の7行目を変更した場合
(現行)
7.  LocalDate dateP = LocalDate.parse("2015-10-01");

(修正後)
//日を「01」→「1」に修正
7. LocalDate dateP = LocalDate.parse("2015-10-1");

修正後のコードでもコンパイルは成功しますが、実行時にDateTimeParseExceptionエラーが発生します。日付/時間を表すテキスト文字列は、有効な日付および、有効な区切り文字で表している必要があり、DateTimeFormatterクラスの定数(事前定義されたフォーマッタ)を使って解析されます。

DateTimeFormatterクラスの主なフォーマッタは表3のとおりです。

表3:DateTimeFormatterクラスの主なフォーマッタ
定数名 説明
ISO_DATE オフセット付きまたはオフセットなしの日付に対し、書式設定や解析を行うISO日付フォーマッタ 2011-12-03
2011-12-03+01:00
ISO_TIME オフセット付きまたはオフセットなしの時間に対し、書式設定や解析を行うISO時間フォーマッタ 10:15
10:15:30
10:15:30+01:00
ISO_DATE_TIME オフセット付きまたはオフセットなしの日付/時間に対し、書式設定や解析を行うISO日付/時間フォーマッタ 2011-12-03T10:15:30
2011-12-03T10:15:30+01:00

また、独自のフォーマッタを使用して、テキスト文字列から日付/時間オブジェクトを取得することも可能です。DateTimeFormatterクラスには、指定されたパターンを使用してフォーマッタを作成するためのofPattern()メソッドが提供されています。

次のサンプル(Sample2.java)では、事前定義されたフォーマッタと独自フォーマッタを使用しています。

■Sample2.java
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Sample2 {
  public static void main(String[] args) {
    LocalDateTime dateTime1 = LocalDateTime.now();
    DateTimeFormatter fmt1 = DateTimeFormatter.ISO_DATE;
    System.out.println("now()               : " + dateTime1);
    System.out.println("fmt1.format()       : " + fmt1.format(dateTime1));
    System.out.println("dateTime1.format()  : " + dateTime1.format(fmt1));
    
    DateTimeFormatter fmt2 = 
             DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    String target = "2015/10/01 21:03:20";
    LocalDateTime dateTime2 = LocalDateTime.parse(target, fmt2);
    System.out.println("ofPattern()         : " + dateTime2);
  }
}
■Sample2.javaの実行結果
now()               : 2015-11-16T16:28:42.733
fmt1.format()       : 2015-11-16
dateTime1.format()  : 2015-11-16
ofPattern()         : 2015-10-01T21:03:20

6行目ではnow()メソッドを使用して、LocalDateTimeオブジェクトを作成しています。また、7行目では、DateTimeFormatterクラスのISO_DATE定数を指定し、事前定義されたフォーマッタを取得しています。8行目では、日付/時刻をそのまま出力していますが、9行目では、7行目で取得したフォーマッタのformat()メソッドにLocalDateTimeオブジェクトを指定することで、日付のみ表示しています。10行目では、LocalDateTimeオブジェクトのformat()メソッドにフォーマッタを指定しています。このように、formatメソッドは、両方のクラスに提供されています。

また、12〜13行目では、ofPattern()メソッドの引数に独自のパターンであるyyyy/MM/dd HH:mm:ssを指定して、DateTimeFormatterオブジェクトを取得しています。15行目では、parse()メソッドに解析したい文字列と、取得したDateTimeFormatterオブジェクトを指定しています。

日付/時間の加減算

Java SE 8以前にも、日付/時間の演算処理に最低限必要なAPIは用意されていましたが、使いやすいものではありませんでした。Date and Time APIでは、直感的に使用できるメソッドが多数用意されています。

表4は、LocalDateクラスの加算を行うメソッドです。

表4:LocalDateクラスの加算を行うメソッド
メソッド名 説明
LocalDate plusDays(long daysToAdd) 指定された日数を加算した、このLocalDateのコピーを返す
LocalDate plusMonths(long monthsToAdd) 指定された月数を加算した、このLocalDateのコピーを返す
LocalDate plusWeeks(long weeksToAdd) 指定された週数を加算した、このLocalDateのコピーを返す
LocalDate plusYears(long yearsToAdd) 指定された年数を加算した、このLocalDateのコピーを返す

同様に、減算を行うメソッドとして、minusDays()などの「minusXXX()」メソッドも提供されています。

次のサンプル(Sample3.java)は、LocalDateオブジェクトに加算を行っています。

■Sample3.java
import java.time.LocalDate;

public class Sample3 {
  public static void main(String[] args) {
    LocalDate date = LocalDate.of(2015, 10, 1);
    System.out.println("date     : " + date);
    System.out.println("3日後    : " + date.plusDays(3));
    System.out.println("5ケ月後  : " + date.plusMonths(5));
    System.out.println("2週間後  : " + date.plusWeeks(2));
    System.out.println("10年後   : " + date.plusYears(10));
    System.out.println("date     : " + date);
  }
}
■Sample3.javaの実行結果
date     : 2015-10-01
3日後    : 2015-10-04
5ケ月後  : 2016-03-01
2週間後  : 2015-10-15
10年後   : 2025-10-01
date     : 2015-10-01

7~10行目では、LocalDateオブジェクトに日、月、週、年の加算を行っています。しかし、6行目と11行目を見ると、加算前と加算後でdate変数が表している日付は同じです。Date and Time APIの各クラスは不変オブジェクトであるため、オブジェクトが保持する情報が変化するわけではありません。加算後のオブジェクトを取得したい場合は、各メソッドの戻り値を変数に代入してください。以下は、加算した結果をdate変数に再代入するように、7行目を修正した例です。

加算した結果をdate変数に再代入するように、Sample3.javaの7行目を修正した例
(現行)
7.  System.out.println("3日後    : " + date.plusDays(3));

(修正後)
7.  date = date.plusDays(3);
8.   System.out.println("3日後    : " + date);

次のページ
模擬問題に挑戦!

この記事は参考になりましたか?

  • Facebook
  • Twitter
  • Pocket
  • note
  • hatena
みちこ先生のオラクル認定Javaプログラマ Silver SE 7/8 合格コース連載記事一覧

もっと読む

この記事の著者

山本道子(ヤマモト ミチコ)

2004年Sun Microsystems社を退職後、有限会社Rayを設立し、システム開発、インストラクタ、執筆業などを手がける。著書に『オラクル認定資格教科書 Javaプログラマ Bronze SE 7/8』『同Silver SE 8』『同Gold SE 8』のほか、『SUN教科書 Webコンポーネントディベロッパ(SJC-WC)』、『携帯OS教科書 Androidアプリケーション技術者ベーシック』、『Linux教科書 LPICレベル1 スピードマスター問題集』(共著)、監訳書に『SUN教科書 Javaプログラマ(SJC-P)5.0・6.0 両対応』(いずれも翔泳社刊)などがある。月刊誌『日経Linux』(日経BP社刊)でLPIC対策記事を連載。日々の楽しみは晩酌、好きな言葉は表面張力。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事をシェア

  • Facebook
  • Twitter
  • Pocket
  • note
  • hatena
HRzine
https://hrzine.jp/article/detail/38 2016/01/05 19:48

Special Contents

AD

Job Board

AD

おすすめ

アクセスランキング

アクセスランキング

イベント

HRzine Day(エイチアールジン・デイ)は、人が活き会社が成長する人事のWebマガジン「HRzine」が主催するイベントです。毎回、人事の重要課題を1つテーマに設定し、識者やエキスパードが持つ知見・経験を、参加者のみなさんと共有しています。

2024年2月1日(木)12:00~17:40

イベントカレンダーを見る

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング