さいしょに
日付について書くつもりはなかったけど CalendarView
を使おうとしたら日付の設定方法がわりとわからなかったのでまとめ。
日付
Date
は java.util.Date を使うみたい。
1 |
public class Date extends Object implements Serializable, Cloneable, Comparable<Date> |
現在日時取得
1 |
val now = Date() |
日付操作
指定の Date
の2日後がほしいといった場合は java.util.Calendar を使うみたい。
1 |
public abstract class Calendar extends Object implements Serializable, Cloneable, Comparable<Calendar> |
現在日時取得
1 2 3 |
val calendar = Calendar.getInstance() val now: Date = calendar.time val nowTimeInMillis: Long = calendar.timeInMillis |
日付操作
1 2 3 4 5 6 |
val calendar = Calendar.getInstance() calendar.add(Calendar.YEAR, 2) calendar.add(Calendar.MONTH, 3) calendar.add(Calendar.DATE, 1) val date = calendar.time // 現在日時から2年と3ヶ月と1日後の日時 |
年など各要素取得
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
val calendar = Calendar.getInstance() val year = calendar[Calendar.YEAR] val month = calendar[Calendar.MONTH] + 1 // 0~11 val day = calendar[Calendar.DATE] val hour = calendar[Calendar.HOUR_OF_DAY] val minute = calendar[Calendar.MINUTE] val second = calendar[Calendar.SECOND] val week = calendar[Calendar.DAY_OF_WEEK] // 1~7 val format = "yyyy/MM/dd E HH:mm:ss" val text = DateFormat.format(format, calendar.time) // 出力 "2020/06/05 金 09:01:10" Log.d(TAG, text.toString()) // 出力 "year: 2020, month: 6, day: 5, hour: 9, minute: 1, second: 10, week: 6" Log.d(TAG, "year: $year, month: $month, day: $day, hour: $hour, minute: $minute, second: $second, week: $week") |
日付比較
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
val format = "yyyy/MM/dd E HH:mm:ss" val now = Date() val calendar = Calendar.getInstance() calendar.time = now val calendar2 = Calendar.getInstance() calendar2.time = now calendar2.add(Calendar.DATE, 1) calendar2.add(Calendar.MONTH, 1) val text1 = DateFormat.format(format, calendar.time) val text2 = DateFormat.format(format, calendar2.time) Log.d(TAG, text1.toString()) // 2020/06/05 金 09:23:00 Log.d(TAG, text2.toString()) // 2020/07/06 月 09:23:00 val before = calendar.before(calendar2) val after = calendar.after(calendar2) val diff = calendar.compareTo(calendar2) // 同じなら0, 前なら-1, 後なら1 // 出力 "before: true, after: false, diff: -1" Log.d(TAG, "before: $before, after: $after, diff: $diff") |
フォーマット
日付フォーマットには下記の3つのクラスがある
それぞれ下記のように定義されており、java.text.DateFormat は抽象クラスなので日付フォーマットに利用できるのは java.text.SimpleDateFormat と android.text.format.DateFormat の2つである。
1 2 3 |
public abstract class DateFormat extends Format public class SimpleDateFormat extends DateFormat |
1 |
open class DateFormat |
java.text.SimpleDateFormat
端末のロケール設定に依らず決まったフォーマットにしたい場合はこちらを使う。フォーマットには下記の関数が用意されている。文字列から日付への変換はこっちを使う。
1 2 3 4 5 6 |
public StringBuffer format (Date date, StringBuffer toAppendTo, FieldPosition pos) // 上のやつはよくわからないのでこっち使えばいいと思う public StringBuffer format (Date date) |
コンストラクタは下記の3つが用意されている。
1 2 3 4 5 6 |
public SimpleDateFormat () public SimpleDateFormat (String pattern) public SimpleDateFormat (String pattern, Locale locale) |
現在時刻表示(日付 -> 文字列)
1 2 3 4 5 |
val format = "yyyy/MM/dd E HH:mm:ss" val text = SimpleDateFormat(format).format(Date()) // "2020/06/05 金 07:54:26"と出力された Log.d(TAG, text.toString()) |
文字列 -> 日付変換
1 2 3 4 5 |
val format = "yyyy/MM/dd" val date = SimpleDateFormat(format).parse("2020/12/20") val text = SimpleDateFormat(format).format(date) // 出力 "2020/12/20" Log.d(TAG, text) |
色々ハマりポイントがあるらしい(SimpleDateFormat の罠まとめ & 対策コード例 - ~saiya/hatenablog)
実在しない日時が通る
1 2 3 4 5 |
val format = "yyyy/MM/dd" val dateFormat = SimpleDateFormat(format) val date = dateFormat.parse("2020/02/31") val text = dateFormat.format(date) Log.d(TAG, text) // 2020/03/02 |
isLenient
に false
を設定すれば ParseException になる
1 2 3 4 |
val format = "yyyy/MM/dd" val dateFormat = SimpleDateFormat(format) dateFormat.isLenient = false val date = dateFormat.parse("2020/02/31") // ParseException |
桁数不足や末尾が余計でも通る
1 2 3 4 5 6 7 8 9 |
val format = "yyyy/MM/dd" val dateFormat = SimpleDateFormat(format) val date1 = dateFormat.parse("2020/02/31aa") val text1 = dateFormat.format(date1) Log.d(TAG, text1) // 2020/03/02 val date2 = dateFormat.parse("20/2/1") val text2 = dateFormat.format(date2) Log.d(TAG, text2) // 0020/02/01 |
android.text.format.DateFormat
端末のロケール設定に従う場合はこちらを使う。フォーマットには下記3つの関数が用意されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
open static fun format( inFormat: CharSequence!, inTimeInMillis: Long ): CharSequence! open static fun format( inFormat: CharSequence!, inDate: Date! ): CharSequence! open static fun format( inFormat: CharSequence!, inDate: Calendar! ): CharSequence! |
現在時刻表示
1 2 3 4 5 6 7 8 9 |
val format = "yyyy/MM/dd E HH:mm:ss" val text1 = DateFormat.format(format, Calendar.getInstance()) val text2 = DateFormat.format(format, Date()) val text3 = DateFormat.format(format, System.currentTimeMillis()) // すべて"2020/06/05 金 07:54:26"と出力された Log.d(TAG, text1.toString()) Log.d(TAG, text2.toString()) Log.d(TAG, text3.toString()) |
さいごに
なんかクラスが色々あってややこしい。java.time.LocalDate もあった。。。とりあえずいいや。
参考
- java.util.Date
- java.util.Calendar
- java.text.SimpleDateFormat
- java.text.DateFormat
- android.text.format.DateFormat
- SimpleDateFormat の罠まとめ & 対策コード例 - ~saiya/hatenablog
コメント