Help us understand the problem. What is going on with this article?

標準クラスについて

More than 1 year has passed since last update.

日付の扱い方

日付を扱う方法は大きく以下の通り
・long型の変数に格納
・java.date.utilクラスを利用
・Calenderクラスを利用
・SimpleDateFormatクラスの利用

long型の変数に格納

特徴

・long型の変数は、1970/1/1 00:00:00(エポック)を基準に、経過したミリ秒数(1/1000)で日時情報を表現。
・long型の変数は、11223344・・・といった数値の羅列のため、コンピューターにとって分かり易い。

現在の日時を調べる方法

long 変数名 = System.currentTimeMillis();
System.currentTimeMilliはミリ秒で表される現在の時間を返す。

問題点

・「11223344」といった、数値の羅列は人間は理解出来ない・・・
・long型のデータは、他にも使用されるため、中に入っているデータが日付かどうか分からない。

java.date.utilパッケージに格納

特徴

Date型の変数なら、中身は日時情報という判別が付く。

使用方法

「クラスをインポート」

java.date.utilクラスをimportする

「現在日時を持つ、Dateインスタンスを生成」

Date 変数名 = new Date();

「long値引数時点の日時を持つ、データインスタンスを生成」

Date 変数名 = new Date(long値の引数);

使用例

Date now = new Date();//①Dateインスタンスを生成し、現在日時を得る。
System.out.println(now);//出力結果①
long nowTime = now.getTime();//②Dateインスタンスの、getTimeメソッドを使用しlong値の現在日時を得る
System.out.println(nowTime);//出力結果②
Date past = new Date(nowTime);//③long値を代入して、新たにデータインスタンスを生成する
System.out.println(past);//出力結果③

「出力結果」

Sat Mar 03 11:41:38 JST 2018//①
1520044898396//②
Sat Mar 03 11:41:38 JST 2018//③

問題点

やはり、long値を使用しているので読みづらい・・・

Calenderクラスを利用

特徴

Dateクラスで得たlong型データを、Calenderクラスにて、int型データとの相互変換が可能。

使用方法

「Calenderクラスを利用して、int型引数でDate型データを生成」

java.util.Calendar;をインポートする

「Calenderクラスを利用して、int型引数でDate型データを生成」

Calendar インスタンス名 = Calendar.getInstance();//Calendarクラスのインスタンスを生成
インスタンス名.set(年、月、日、時、分、秒);//インスタンスにint型で日時情報を入力※月は0~11で設定!!
または
インスタンス名.set(Calendar.~,値);//
Date 変数名  = c.getTime();//Date型データの取り出し

(Calenderクラスからint型のデータを取り出す方法)

int year =Calenderクラス変数.get(Calendar.YEAR);
int month =Calenderクラス変数.get(Calendar.MONTH);
int day =Calenderクラス変数.get(Calendar.DAY_OF_MONTH);
int hour =Calenderクラス変数.get(Calendar.HOUR);
int minute =Calenderクラス変数.get(Calendar.MINUTE);
int second =Calenderクラス変数.get(Calendar.SECOND);

「CalenderクラスにDate型のデータを入れる方法」

インスタンス名.setTime(Date型の引数);

使用例

    public static void main(String[] args) {
        //インスタンスを生成
        Date now = new Date();//Dateクラスのnowインスタンスを生成し、現在日時を取得
        Calendar calendar = Calendar.getInstance();//Calendarクラスのcalendarインスタンスを生成

        //①calendarインスタンスから、年のみをint型で取り出す
        calendar.setTime(now);//①calenderインスタンスにnowインスタンス(現在日時)を代入
        int year = calendar.get(Calendar.YEAR);//①calenderクラスから、年のみ取り出す
        System.out.println(year);//出力結果①

        //②int型で年月を設定
        calendar.set(1995,1,20,10,10,10);//②calenderインスタンスにint型で年月を設定
        Date past = calendar.getTime();//②設定した年月をDate型の変数pastへ代入
        System.out.println(past);//出力結果②
    }

「出力結果」

2018//①
Mon Feb 20 10:10:10 JST 1995//②

SimpleDateFormatクラスの利用

特徴

Dateクラスで得たlong型データを、SimpleDateFormatクラスにて、String型データとの相互変換が可能。

使用方法

「クラスをインポート」

java.text.SimpleDateFormat;クラスをインポート

「Date型からString型を生成する」

SimpleDateFormat 変数名 = new SimpleDateFormat(書式文字列);//インスタンスを生成する
String 変数名 = SimpleDateFormatインスタンス名.format(Date型変数);//SimpleDateFormatクラスのformatメソッドで、型をDate→Stringに変換する

「String型からDate型を生成する」

SimpleDateFormat 変数名 = new SimpleDateFormat(書式文字列);//SimpleDateFormatクラスのインスタンスを生成する
Date Date型変数名 = SimpleDateFormatインスタンス名.parse(文字列);//SimpleDateFormatクラスのparseメソッドで、型をString→Dateに変換する
※書式文字列はyyyy/MM/dd`の様に出力したいフォーマットを指定する

使用例

    public static void main(String[] args) throws Exception {
        //インスタンスを生成
        Date now = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

        //Date型→String型
        String date = format.format(now);

        //String型→Date型
        Date past = format.parse("1995/01/20 10:10:10");

        //出力
        System.out.println(date);
        System.out.println(past);
    }

「出力結果」

2018/03/03 15:59:07
Fri Jan 20 10:10:10 JST 1995

暗黙の継承

考え方

クラスを定義するとき、extendで親クラスを指定しなければ、親クラスにjava.lang.Objectを継承した事になる。

java.lang.Objectの中身

equals():あるインスタンスと自分自身が同じか調べる
toString():自分自身の文字列内容を返す

暗黙の継承のメリット

①Objectを引数として使用出来る

「例」

    public static void main(String[] args) {
        Object[] o = new Object[2];
        o[0] = new Hero();
        o[1] = "こんにちは";
        for(Object ox:o) {
            System.out.println(ox);
        }
    }
「出力結果」
Java14.Hero@70dea4e
こんにちは

多態性によって、全てのオブジェクトはざっくりObjectとみなせるため、引数=何でも良い時にObjectを指定出来る。

②全てのクラスに最低限必要なメソッドを備える事が出来る。

toStringについて

「デフォルト」

型名@英数字

//Heroインスタンスを出力した場合
Java14.Hero@70dea4e

「変えたいなら」

@Override
public String toString(){
 return "名前は"+this.name・・・
}

上記の様に出力方法をオーバーライドする必要がある。
@Overrideはオーバーライドしますという意味。

equalsについて

ざっくりいうと、同じかどうかの判断をする。同じかどうかの判断は通常==で行うが、equalsは少し違った等価判定というものをする。

「等値 ==」

全く同じである状態

Hero h1 = new Hero;
Hero h2 = h1;

この場合、h1とh2は等値である。

「等価 equals」

同じ内容である状態

Hero h1 = new Hero("ヨシヒコ")
Hero h2 = new Hero("ヨシヒコ")

この場合h1とh2は、それぞれ別のインスタンスだが、中身が同じのため等価である。

「使用方法」

しかし、デフォルトのequalsは等値判定となっているため、等価判定に修正して使用する必要がある。

「例」

//mainクラス
    public static void main(String[] args) {
        Hero hero1 = new Hero();
        hero1.name = "ヨシヒコ";
        hero1.hp = 100;

        Hero hero2 = new Hero();
        hero2.name = "ヨシヒコ";
        hero2.hp = 100;

        if (hero1.equals(hero2) == true) {
            System.out.println("同じ内容です");
        } else {
            System.out.println("違う内容です");
        }
    }
//Heroクラス
public class Hero {
    String name;
    int hp;

    //equalsの書き変え
    @Override
    public boolean equals(Object o) {
        if (this == o) {//等値だった場合はtrue
            return true;
        }
        if (o instanceof Hero) {//同じクラスもしくは、親子関係のクラスの場合
            Hero h = (Hero) o;//Objectクラスの変数oをHeroクラスの変数hにキャスト変換して、Hero型変数hに代入
            if (this.name.equals(h.name)) {//名前が等しければ等価
                return true;
            }
        }
        return false;
    }
}

「出力結果」

同じ内容です

ラッパークラス

ラッパークラスとは

intなどの基本データ型に対応したクラス

ラッパークラスのメリット

「メソッドが使用できる」

メソッドは全てstaticで記載されているため、ラッパークラスをインスタンス化せずに使用する事が出来る。

「インスタンスとして扱える」

基本データ型としてそのまま扱えないAPIがいくつかあるため、わざわざ一度インスタンス化させて数値を持たせる。

「使用例」
        int i1 = 15;//int型の変数i1に15を代入
        Integer i2 = Integer.valueOf(i1);//i2インスタンスの生成
        System.out.println(i2);

valueOf:指定された int 値を表す Integer インスタンスを返すメソッド

「出力結果」
15

基本データ型とラッパークラスの変換

通常だと

        int i1 = 15;//int型の変数i1に15を代入
        Integer i2 = Integer.valueOf(i1);//i2インスタンスの生成・int型→Integer型に変換
        int i3 = i2.intValue();//Integer型→int型に変換

intValue: Integer の値を int として返すメソッド

これだとデータの変換に毎回メソッドを使う必要がある・・・

「AutoBoxing・AutoUnboxing機能」

ラッパークラス型⇆基本データ型の変換時は自動で、valueOfintValueが行われる。
このAutoBoxing・AutoUnboxing機能はデフォルトで備わっている。

        int i1 = 15;//int型の変数i1に15を代入
        Integer i2 = i1;//int型→Integer型に自動変換
        int i3 = i2;//Integer型→int型に自動変換
k_sk193
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away