2019/02/14
みたいな具体的な日付を見せられても
直感的に現時点からどのくらい離れた時間なのかわかりにくいので、
x日前
とかx秒前
みたいに変換するクラスを書いた
とりあえずアプリで使う用に書いたので汎用化はそのうち
実装
import 'package:meta/meta.dart';
import 'package:intl/intl.dart';
class ElapsedTime {
DateFormat formatter1 = DateFormat('yyyy/MM/dd');
DateFormat formatter2 = DateFormat('MM/dd');
ElapsedTime({String format1 = null, String format2 = null}){
if (format1 != null) {
this.formatter1 = DateFormat(format1);
}
if (format2 != null) {
this.formatter2 = DateFormat(format2);
}
}
String fromAt({@required DateTime from, @required DateTime at}) {
final sec = from.difference(at).inSeconds;
if (sec >= 60 * 60 * 24 * 30 * 12) {
return formatter1.format(from);
} else if (sec >= 60 * 60 * 24 * 30) {
return formatter2.format(from);
} else {
return _ElapsedTimeDuration(seconds: sec).tostr();
}
}
String fromNow({@required DateTime at}){
return fromAt(from: DateTime.now(), at: at);
}
}
class _ElapsedTimeDuration extends Duration{
_ElapsedTimeDuration({int seconds}): super(seconds: seconds);
String tostr() {
final sec = this.inSeconds;
if (sec >= 60 * 60 * 24) {
return '${this.inDays.toString()}日前';
} else if (sec >= 60 * 60) {
return '${this.inHours.toString()}時間前';
} else if (sec >= 60) {
return '${this.inMinutes.toString()}分前';
} else {
return '$sec秒前';
}
}
}
使い方
var formatter = ElapsedTime();
formatter.fromAt(from: DateTime(2019,2,14,0,0,3), at: DateTime(2019,2,14,0,0,0)); // => "3秒前"
formatter.fromAt(from: DateTime(2019,2,14,0,3,0), at: DateTime(2019,2,14,0,0,0)); // => "3分前"
formatter.fromAt(from: DateTime(2019,2,14,3,0,0), at: DateTime(2019,2,14,0,0,0)); // => "3時間前"
formatter.fromAt(from: DateTime(2019,2,17,0,0,0), at: DateTime(2019,2,14,0,0,0)); // => "3日前"
var formatter = ElapsedTime(format1: 'yy-MM-dd', format2: 'MM-dd H');
formatter.fromAt(from: DateTime(2019,4,17,0,0,0), at: DateTime(2019,2,14,0,0,0)); // => "02-17 0"
formatter.fromAt(from: DateTime(2020,2,17,0,0,0), at: DateTime(2019,2,14,0,0,0)); // => "20-02-14"
今後の課題
a month ago / 1 month ago / 2 months ago
とか考えると面倒だったので今回はスルーしたけどi18n対応したい。
現状だと未来の日付だと -3日前
等になるので x日後
系にも対応したい。