日付時刻型の宣言と計算方法
DateTime型は、時刻も保持しています。日数計算を行う場合は、時刻部分を消去する必要があります。
flutter pub add age_calculator
.....
DateTime birthday = DateTime.parse('1900-01-01'); //仮の初期値 意味はない
DateTime selecteddate1 = DateTime.parse('1900-01-01'); //仮の初期値 意味はない
DateTime selecteddate2 = DateTime.parse('1900-01-01'); //仮の初期値 意味はない
DateFormat dateF = DateFormat('yyyy-MM-dd'); // 時刻を消すために使用
//shared_preferences に生年月日を保存ーーーーーーーーーーーーーー
// 設定値を取得
void _readSetting() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
// null なら、初期値で適当な日付文字列を渡す(Null Safety)
String sbirthday = prefs.getString('birthday') ?? '1968-06-10';
setState(() {
birthday = DateTime.parse(sbirthday);
});
}
// 設定値を保存
void _saveSetting() async {
SharedPreferences prefs = await SharedPreferences.getInstance();
// birthdayを1900-01-01形式の文字列に変換して保存
String sbirthday = dateF.format(birthday);
await prefs.setString('birthday', sbirthday);
}
// ウィジェットの初期化処理ーーーーーーーーーーーーーーーーーーーー
@override
void initState() {
super.initState();
// 保存された設定を読み出す
_readSetting();
// 時刻情報を削除する
setState(() {
DateTime d =DateTime.now(); // 時刻が入っている。
String ds = dateF.format(d); // 一旦文字列にして時刻を消す
selecteddate1 = DateTime.parse(ds);
selecteddate2 = selecteddate1.add(Duration(days: 30));
});
}
// カレンダーで日付を選択するダイアログボックスーーーーーーーーーーーーー
Future<void> _selectBirthDay(BuildContext context) async {
final DateTime? picked = await showDatePicker(
context: context,
initialDate: birthday,
firstDate: DateTime(DateTime.now().year - 120),
lastDate: DateTime(DateTime.now().year + 120),
);
setState(() {
DateTime d = picked ?? birthday;
String sd = dateF.format(d);
birthday = DateTime.parse(sd);
});
}
年齢計算その他色々
年齢計算でも、時刻情報を00:00にした方が良いでしょう。(1日ズレるだけですが)
import 'package:age_calculator/age_calculator.dart';
void main() {
DateTime birthday = DateTime(1997, 3, 5);
DateDuration duration;
// 今日が 2021-03-08 の場合。。
duration = AgeCalculator.age(birthday);
print('Your age is $duration'); // Your age is Years: 24, Months: 0, Days: 3
final year = duration.years;
final month = duration.months;
final day = duration.days;
return '$year歳$monthヶ月$day日'; // 24歳0ヶ月3日
//Find out your age on any given date
duration = AgeCalculator.age(birthday, today: DateTime(2030, 5, 1));
print('Your age is $duration'); // Your age is Years: 33, Months: 1, Days: 26
// Find out when your next birthday will be at 2021-03-08
duration = AgeCalculator.timeToNextBirthday(birthday);
print('You next birthday will be in $duration');
// You next birthday will be in Years: 0, Months: 11, Days: 25
// Find out when your next birthday will be on any given date
duration = AgeCalculator.timeToNextBirthday(birthday,
fromDate: DateTime(2021, 3, 2));
print('You next birthday will be in $duration');
// You next birthday will be in Years: 0, Months: 0, Days: 3
// Find out the difference between two dates
duration = AgeCalculator.dateDifference(
fromDate: DateTime(2021, 1, 2),
toDate: DateTime(2025, 5, 2),
);
print('The difference is $duration');
// You next birthday will be in Years: 4, Months: 4, Days: 0
// Add time to any date
DateTime date = AgeCalculator.add(
date: DateTime(2021, 1, 2),
duration: DateDuration(years: 5, months: 2, days: 1));
print(date);
// 2026-03-03 00:00:00.000
}
DateTime型の日本語表記、カレンダー入力Widget、西暦和暦変換、等
flutterの多言語対応は、2025年1月より大規模な変更がなされました。具体的には、日数計算アプリの記事を見てください。