日付を簡単に扱いたいんだよという人向け。

 Javaの日付関連の扱いが面倒だったので、適当に日付を扱うクラスをkotlinで作成してみた。Javaではミリセカンドに関して適正に処理しないと日付の比較時に問題になるので、このクラスでは日常の使用に特化しミリセカンドフリーで使用することができる。
 デバッグしていないので使用には注意。
 基本的な使い方

■インスタンスの生成方法 と日時の設定方法
・現在の日付の取得
val dateTime: DateTime = DateTime.now()
・文字列から日付の作成 フォーマットを指定しないとyyyy/MM/dd kk:mm:ss形式 フォーマットの指定も可能
val dateTime: DateTime = DateTime.parse("2000/01/01 23:01:01")
val dateTime: DateTime = DateTime.parse("18-01-01 23:01:01", "yy-MM-dd kk:mm:dd")
・またはインスタンスを生成して日時を設定する Date()やCalendar()オブジェクトからも設定できる
val dateTime = DateTime()
dateTime.setDateTime(date)
dateTime.setDateTime(calendar)
dateTime.setDateTime(2000,1,1,23,1,1)

■各種日付などの取得方法 プロパティになっているので取得できる
var year: Int = dateTime.year
var day: Int = dateTime.day

■文字列を日時に変換できるかどうか確認
・フォーマットを指定しないとyyyy/MM/dd kk:mm:ss形式 フォーマットの指定も可能
val bool: Boolean = DateTime.tryParse("2000/01/01 23:01:01")
val bool: Boolean = DateTime.tryParse("18-01-01 23:01:01", "yy-MM-dd kk:mm:dd")

■日時の文字列への変換 フォーマットを指定しないとyyyy/MM/dd kk:mm:ss形式で返す
val str: String = dateTime.toString()
val str: String = dateTime.toString("yy-MM-dd kk:mm:ss")

■日時の計算 年、月、日、時、分、秒の足し算引き算ができる 引き算はマイナス値にする
・1年1月1日などまとめての足し引きができる
dateTime.addDays(29)
dateTime.add(1,1,1,0,0,0)

■時刻の比較 時刻の引き渡し時にミリセカンドをリセットしているので、ミリセカンドを考慮せず比較できる
if (dateTime1 == dateTime2) {
    true
}
if (dateTime1 >= dateTime2) {
    true
}





import android.text.format.*
import java.text.SimpleDateFormat

class DateTime() {
    private var mCalendar: Calendar = Calendar.getInstance().also { it.clear() }
    //DateTime ver 1.0
    //プロパティ 日付など各値を取得できる
    var year: Int = mCalendar.get(Calendar.YEAR)
        get() = mCalendar.get(Calendar.YEAR)
    var month: Int = mCalendar.get(Calendar.MONTH)
        get() = mCalendar.get(Calendar.MONTH)
    var day: Int = mCalendar.get(Calendar.DAY_OF_MONTH)
        get() = mCalendar.get(Calendar.DAY_OF_MONTH)
    var hour: Int = mCalendar.get(Calendar.HOUR_OF_DAY)
        get() = mCalendar.get(Calendar.HOUR_OF_DAY)
    var minute: Int = mCalendar.get(Calendar.MINUTE)
        get() = mCalendar.get(Calendar.MINUTE)
    var second: Int = mCalendar.get(Calendar.SECOND)
        get() = mCalendar.get(Calendar.SECOND)
    var isAm: Boolean = mCalendar.get(Calendar.AM_PM) == Calendar.AM
        get() = mCalendar.get(Calendar.AM_PM) == Calendar.AM
    var dayOfWeek: Int = mCalendar.get(Calendar.DAY_OF_WEEK)
        get() = mCalendar.get(Calendar.DAY_OF_WEEK)
    var dayOfYear: Int = mCalendar.get(Calendar.DAY_OF_YEAR)
        get() = mCalendar.get(Calendar.DAY_OF_YEAR)

    //日付計算用
    fun add(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int): DateTime {
        mCalendar.apply {
            add(Calendar.YEAR, year)
            add(Calendar.MONTH, month)
            add(Calendar.DAY_OF_MONTH, month)
            add(Calendar.HOUR, hour)
            add(Calendar.MINUTE, minute)
            add(Calendar.MILLISECOND, second)
        }
        return this
    }
    fun addYeats(year: Int): DateTime = this.also { it.mCalendar.add(Calendar.YEAR, year) }
    fun addMonths(month: Int): DateTime = this.also { it.mCalendar.add(Calendar.MONTH, month) }
    fun addDays(day: Int): DateTime = this.also { it.mCalendar.add(Calendar.DAY_OF_MONTH, day) }
    fun addHours(hour: Int): DateTime = this.also { it.mCalendar.add(Calendar.HOUR, hour) }
    fun addMinutes(minute: Int): DateTime = this.also { it.mCalendar.add(Calendar.MINUTE, minute) }
    fun addSeconds(second: Int): DateTime = this.also { it.mCalendar.add(Calendar.SECOND, second) }

    //日付を設定するメソッド
    fun setDateTime(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int) {
        mCalendar.set(year, month, day, hour, minute, second)
    }
    fun setDateTime(date: Date) {
        mCalendar.time = date
        mCalendar.set(Calendar.MILLISECOND, 0)
    }
    fun setDateTime(calendar: Calendar) {
        setDateTime(calendar.time)
    }

    //日付を文字列に変換するるメソッド
    override fun toString(): String = DateFormat.format("yyyy/MM/dd kk/mm/ss", mCalendar.time).toString()
    fun toString(format: String): String = DateFormat.format(format, mCalendar.time).toString()

    //その他メソッド 日付のクリア
    fun clear(): Unit = mCalendar.clear()
    //Date()の取得
    fun toDate(): Date = mCalendar.time
    //DateTime同士の比較 ==が使える
    override operator fun equals(dateTime: Any?): Boolean {
        return if (dateTime is DateTime) {
            compareTo(dateTime as DateTime) == 0
        } else {
            false
        }
    }
    //DateTime同士の比較 >=が使える
    operator fun compareTo(dateTime: DateTime): Int {
        val calendar: Calendar = Calendar.getInstance().also { it.time = dateTime.toDate() }
        return mCalendar.compareTo(calendar)
    }

    companion object {
        //現在の日時を所有したDateTimeオブジェクトを返す
        fun now(): DateTime {
            return DateTime().also {
                it.mCalendar = Calendar.getInstance()
                it.mCalendar.set(Calendar.MILLISECOND, 0)
            }
        }
        //文字列から日付を作成しDateTimeオブジェクトを返す
        fun parse(dateTimeString: String): DateTime {
            val dateTime = DateTime()
            try {
                dateTime.mCalendar.time = SimpleDateFormat("yyyy/MM/dd kk:mm:ss", Locale.JAPAN).also { it.isLenient = false }.parse(dateTimeString)
            } catch (e: Exception) {
                throw IllegalArgumentException("can't convert string to DateTime")
            }
            return dateTime
        }
        fun parse(dateTimeString: String, format: String): DateTime {
            val dateTime = DateTime()
            try {
                dateTime.mCalendar.time = SimpleDateFormat(format, Locale.JAPAN).also { it.isLenient = false }.parse(dateTimeString)
            } catch (e: Exception) {
                throw IllegalArgumentException("can't convert string to DateTime")
            }
            return dateTime
        }
        //与えられた文字列を変換できるかどうか
        fun tryParse(dateTimeString: String): Boolean {
            return try {
                SimpleDateFormat("yyyy/MM/dd kk:mm:ss", Locale.JAPAN).also { it.isLenient = false }.parse(dateTimeString)
                true
            } catch (e: Exception) {
                false
            }
        }
        fun tryParse(dateTimeString: String, format: String): Boolean {
            return try {
                SimpleDateFormat(format, Locale.JAPAN).also { it.isLenient = false }.parse(dateTimeString)
                true
            } catch (e: Exception) {
                false
            }
        }
    }
}