LoginSignup
4
0

More than 5 years have passed since last update.

過去の時間を読みやすくする

Posted at

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日後系にも対応したい。

リポジトリ

github
pub

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0