はじめに
最近アプリ開発の仕事をしていて、日付を取得し任意の1週間をリスト表示するということをしました。
日時情報はDateTimeクラスを用いることで簡単に取得し扱えるので今回はその辺のところを簡単にまとめたいと思います。
日付を取得したいということは結構頻繁にあるかと思いますし、今度紹介するかもしれませんがカレンダーを簡単に実装できるパッケージがあってもちろんそこでもDateTimeクラスが用いられています。
DateTimeクラスはプロパティ・メソッドがすごくわかりやすくできているのでクラスについてまだ少しわからないという方でもいい練習になると思います。
DateTimeクラス
DateTimeクラスは日時情報を簡単に扱うことができるクラスで、年・月・日・曜日などの情報がプロパティとして、その日から何日前(後)の情報を取得するようなメソッドとして用意されています。
ここではよく使うであろうプロパティとメソッドを紹介します。
また任意の日時でこのようなプロパティやメソッドを使いたい場合はDateTimeクラスのインスタンスが必要になるのでコンストラクタや.parseメソッドの使い方も紹介します。
コンストラクタ
DateTime
()の中に任意の日時情報を入れることでその日時のDateTimeインスタンスを生成できます。
()内に入れる順番は 年、月、日、時間、分、秒、ミリ秒、マイクロ秒 で全てint型で入力します。
また全て入力する必要はありません。例えば分まで入力してあとは入力しない場合入力しなかった秒以下は全て0としてインスタンス化されます。
DateTime.now
このコンストラクタを用いると現在の日時情報を取得できます。()内には何も入れなくて大丈夫です。
このコンストラクタを使うことでストップウォッチの10秒チャレンジアプリなんか簡単に作れそうですね。
parse
これは厳密にはコンストラクタではなくメソッドですがDateTimeコンストラクタと同じように任意の日時情報でDateTimeインスタンスを生成することができます。
ただDateTimeコンストラクタとは違い()内にはint型ではなくString型を入力します。
例えば
“2019-05-06”
“2019-05-06 20:30:00”
“20190506”
“20190506 20:30:00”
さらに詳しく知りたい方は公式のドキュメント(DateTimeクラス)の.parseメソッドの項目を見てください。
例)
1 2 3 |
var _dateTime1 = DateTime(2019, 5, 6, 18, 0); var _dateTime2 = DateTime.parse("2019-05-06 20:30:00"); var _dateTimeNow = DateTime.now(); |
プロパティ
ここで示すプロパティは全てint型です。
- year :年を扱います
- month :月を扱います
- day :日を扱います
- weekday :曜日を扱います
- hour :時間を扱います
- minute :分を扱います
- second :秒を扱います
曜日をint型で扱うってどういうこと?となるかもしれませんが簡単です。
1 -> 月曜日
2 -> 火曜日
3 -> 水曜日
4 -> 木曜日
…となります。
またDateTimeクラスでは月と曜日が定数で定義されているので
DateTime.monday -> 1
DateTime.april -> 4
と指定することもできます。
メソッド
add
addメソッドは期間を指定しインスタンスの日時からその期間先に進んだ日時情報を取得できます。
期間はDurationクラスで指定します。
例えばインスタンスの1週間先の日時情報を取得するときはDurationで7日間指定すれば良いということです。
例)
1 2 |
var _dateTimeNow = DateTime.now(); var _7daysAfter = _dateTimeNow.add(new Duration(days: 7)); |
subtract
addメソッドの逆でDurationで指定した期間戻った日時情報を取得できます。
例)
1 2 |
var _dateTimeNow = DateTime.now(); var _7daysAfter = _dateTimeNow.subtract(new Duration(days: 7)); |
isBefore
メソッドを使うDateTimeインスタンスの日時が引数で指定したインスタンスの日時より前かどうかを判別し、前ならtrueを返します。
例)
1 2 3 |
var _dateTimeNow = DateTime.now(); var _7daysAfter = _dateTimeNow.add(new Duration(days: 7)); var _isAfter = _dateTimeNow.isBefore(_7daysAfter); //true |
isAfter
isBeforeメソッドの逆です。
例)
1 2 3 |
var _dateTimeNow = DateTime.now(); var _7daysAfter = _dateTimeNow.add(new Duration(days: 7)); var _isAfter = _dateTimeNow.isAfter(_7daysAfter); //false |
compareTo
isBefore、isAfterメソッドと同じようにして使いますが、帰ってくる値はint型です。
メソッドを使うDateTimeインスタンスの日時が引数で指定したインスタンスの日時と同じかそれより前か後かどうかを判別し、
同じなら -> 0
前なら -> 負の整数
後なら -> 正の整数
を返します。
例)
1 2 3 4 5 |
var _dateTimeNow = DateTime.now(); var _7daysAfter = _dateTimeNow.add(new Duration(days: 7)); var _same = _dateTimeNow.compareTo(_dateTimeNow); //0 var _before = _dateTimeNow.compareTo(_7daysAfter); //-1 var _after = _7daysAfter.compareTo(_dateTimeNow); //1 |
isAtSameMomentAs
2つのDateTimeインスタンスが同じ日時情報を持つかどうかを判別し真偽値で返します。
例)
1 2 |
var _dateTimeNow = DateTime.now() var _same = _dateTimeNow.isAtSameMomentAs(_dateTimeNow); //true |
difference
2つのDateTimeインスタンスの日時の差をDuration、期間として返します。
例)
1 2 3 4 5 6 |
var _dateTimeNow = DateTime.now(); var _7daysAfter = _dateTimeNow.add(new Duration(days: 7)); var _duration = _7daysAfter.difference(_dateTimeNow); var _durationDays = _duration.inDays; //7 var _durationHours = _duration.inHours; //168 var _durationMinutes = _duration.inMinutes; //10080 |
サンプルコード
サンプルとして今週1週間をリスト表示するようなアプリを作って見ます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp extends StatefulWidget { @override _MyAppState createState() => _MyAppState(); } class _MyAppState extends State<MyApp> { static DateTime _now = DateTime.now(); static DateTime _thisWeekMonday = _now.subtract(new Duration(days: _now.weekday - 1)); var _weekName = ['月', '火', '水', '木', '金', '土', '日']; @override Widget build(BuildContext context) { return new MaterialApp( home: Scaffold( appBar: AppBar( title: Text('DateTime'), ), body: Column( children: <Widget>[ RaisedButton( child: Text('Next Week'), onPressed: (){ _pushButton(); }, ), ListView.builder( padding: const EdgeInsets.all(6.0), shrinkWrap: true, itemBuilder: (BuildContext context,int i) { if (i.isOdd) return Divider(); final index = i ~/ 2; final indexDay = _thisWeekMonday.add(new Duration(days: index)); if (index < 7) { return ListTile( title: Text(" ${indexDay.month}/${indexDay.day} (${_weekName[index]})",textAlign: TextAlign.center,), onTap: (){}, ); } }, ), ], ), ), ); } void _pushButton() { setState(() { _thisWeekMonday = _thisWeekMonday.add(new Duration(days: 7)); }); } } |
最後に
日付などのデータを扱う上でDateTimeクラスは必須になってくると思います。
また、ほとんどのアプリでは日付を扱うことになると思うのでDateTimeクラスの基本的な使い方と存在を知っていることは非常に重要なので押さえておきましょう。
コメント