web-dev-qa-db-ja.com

Dart / Flutter:タイムスタンプの変換

私はこれに対する解決策を見つけることができませんでした、私はfirebaseからデータを取得しています、そしてフィールドの1つはこのようなタイムスタンプです->1522129071。それを日付に変換するには?

Swiftの例(機能):

func readTimestamp(timestamp: Int) {
    let now = Date()
    let dateFormatter = DateFormatter()
    let date = Date(timeIntervalSince1970: Double(timestamp))
    let components = Set<Calendar.Component>([.second, .minute, .hour, .day, .weekOfMonth])
    let diff = Calendar.current.dateComponents(components, from: date, to: now)
    var timeText = ""

    dateFormatter.locale = .current
    dateFormatter.dateFormat = "HH:mm a"

    if diff.second! <= 0 || diff.second! > 0 && diff.minute! == 0 || diff.minute! > 0 && diff.hour! == 0 || diff.hour! > 0 && diff.day! == 0 {
        timeText = dateFormatter.string(from: date)
    }
    if diff.day! > 0 && diff.weekOfMonth! == 0 {
        timeText = (diff.day == 1) ? "\(diff.day!) DAY AGO" : "\(diff.day!) DAYS AGO"
    }
    if diff.weekOfMonth! > 0 {
        timeText = (diff.weekOfMonth == 1) ? "\(diff.weekOfMonth!) WEEK AGO" : "\(diff.weekOfMonth!) WEEKS AGO"
    }

    return timeText
}

Dartでの私の試み:

String readTimestamp(int timestamp) {
    var now = new DateTime.now();
    var format = new DateFormat('HH:mm a');
    var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp);
    var diff = date.difference(now);
    var time = '';

    if (diff.inSeconds <= 0 || diff.inSeconds > 0 && diff.inMinutes == 0 || diff.inMinutes > 0 && diff.inHours == 0 || diff.inHours > 0 && diff.inDays == 0) {
      time = format.format(date); // Doesn't get called when it should be
    } else {
      time = diff.inDays.toString() + 'DAYS AGO'; // Gets call and it's wrong date
    }

    return time;
}

そして、それはwaaaaaaayオフの日付/時刻を返します。

更新:

String readTimestamp(int timestamp) {
    var now = new DateTime.now();
    var format = new DateFormat('HH:mm a');
    var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp * 1000);
    var diff = date.difference(now);
    var time = '';

    if (diff.inSeconds <= 0 || diff.inSeconds > 0 && diff.inMinutes == 0 || diff.inMinutes > 0 && diff.inHours == 0 || diff.inHours > 0 && diff.inDays == 0) {
      time = format.format(date);
    } else {
      if (diff.inDays == 1) {
        time = diff.inDays.toString() + 'DAY AGO';
      } else {
        time = diff.inDays.toString() + 'DAYS AGO';
      }
    }

    return time;
  }
13
Mohamed Mohamed

タイムスタンプの形式は、実際にはマイクロ秒ではなく、秒(Unixタイムスタンプ)です。その場合、答えは次のとおりです。

変化する:

var date = new DateTime.fromMicrosecondsSinceEpoch(timestamp);

var date = new DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
31
Alex Haslam

必要な人のための完全なコード:

String readTimestamp(int timestamp) {
    var now = new DateTime.now();
    var format = new DateFormat('HH:mm a');
    var date = new DateTime.fromMillisecondsSinceEpoch(timestamp * 1000);
    var diff = now.difference(date);
    var time = '';

    if (diff.inSeconds <= 0 || diff.inSeconds > 0 && diff.inMinutes == 0 || diff.inMinutes > 0 && diff.inHours == 0 || diff.inHours > 0 && diff.inDays == 0) {
      time = format.format(date);
    } else if (diff.inDays > 0 && diff.inDays < 7) {
      if (diff.inDays == 1) {
        time = diff.inDays.toString() + ' DAY AGO';
      } else {
        time = diff.inDays.toString() + ' DAYS AGO';
      }
    } else {
      if (diff.inDays == 7) {
        time = (diff.inDays / 7).floor().toString() + ' WEEK AGO';
      } else {

        time = (diff.inDays / 7).floor().toString() + ' WEEKS AGO';
      }
    }

    return time;
  }

助けてくれてありがとうAlex Haslam!

6
Mohamed Mohamed

meh、単に https://github.com/andresaraujo/timeago.Dart library;を使用してください。それはあなたのためにすべての重荷を持ち上げます。

編集:

あなたの質問から、相対時間の変換が必要なようです。timeagoライブラリを使用すると、1行のコードでこれを実行できます。日付の変換は、エッジケースが多数あり、特に将来的に異なるロケールをサポートする必要がある場合はすぐに気が遠くなるので、自分で実装することを選択するものではありません。より多くのコードを記述する=テストする必要があります。

import 'package:timeago/timeago.Dart' as timeago;

final fifteenAgo = DateTime.now().subtract(new Duration(minutes: 15));
print(timeago.format(fifteenAgo)); // 15 minutes ago
print(timeago.format(fifteenAgo, locale: 'en_short')); // 15m
print(timeago.format(fifteenAgo, locale: 'es'));

// Add a new locale messages
timeago.setLocaleMessages('fr', timeago.FrMessages());

// Override a locale message
timeago.setLocaleMessages('en', CustomMessages());

print(timeago.format(fifteenAgo)); // 15 min ago
print(timeago.format(fifteenAgo, locale: 'fr')); // environ 15 minutes

epochMSをDateTimeに変換するには、単に...

final DateTime timeStamp = DateTime.fromMillisecondsSinceEpoch(1546553448639);
2
wooldridgetm

タイムスタンプを文字列として保存するだけでなく、ファイアストアを使用している場合、ドキュメントの日付フィールドはタイムスタンプを返します。 Timestampオブジェクトには、toDate()メソッドが含まれています。

Timeagoを使用すると、非常に簡単に相対時間を作成できます。

_ago(Timestamp t) {
  return timeago.format(t.toDate(), 'en_short');
}

build() {
  return  Text(_ago(document['mytimestamp'])));
}

Dateオブジェクトの代わりにTimestampを返すように_firestore.settings(timestampsInSnapshotsEnabled: true);を設定してください。

2