如何显示从时间戳开始经过的时间?

时间:2021-01-19 20:59:59

标签: flutter dart

更准确地说,我想显示自 API 获取时间戳以来经过的分钟数。应该使用 StopwatchTimer 还是其他?

3 个答案:

答案 0 :(得分:2)

在您的情况下,您应该首先将时间戳解析为 DateTime 对象。然后就可以通过 DateTime 类的不同方法获取获取到的 DateTime 与当前时间之间的时间差。

final Duration myDuration = DateTime.parse(myTimeStamp).difference(DateTime.now));

有关详细信息,请访问 https://api.dart.dev/stable/2.10.4/dart-core/DateTime/difference.html

定时器和秒表用于异步工作;在您的情况下,您不需要这种复杂程度。

答案 1 :(得分:1)

我建议如下。您可以更新与 Timer 关联的持续时间,以定义它重建小部件的频率。

我还让您决定如何设置持续时间的格式。

class ElapsedTime extends StatefulWidget {
  final String timestamp;

  const ElapsedTime({
    Key key,
    @required this.timestamp,
  }) : super(key: key);

  @override
  _ElapsedTimeState createState() => _ElapsedTimeState();
}

class _ElapsedTimeState extends State<ElapsedTime> {
  Timer _timer;

  DateTime _initialTime;
  String _currentDuration;


  @override
  void didUpdateWidget(ElapsedTime oldWidget) {
    super.didUpdateWidget(oldWidget);

    if(widget.timestamp != oldWidget.timestamp) {
      _initialTime = _parseTimestamp();
      _currentDuration = _formatDuration(_calcElapsedTime());
    }
  }

  @override
  void initState() {
    super.initState();

    _initialTime = _parseTimestamp();
    _currentDuration = _formatDuration(_calcElapsedTime());

    _timer = Timer.periodic(const Duration(seconds: 1), (Timer t) {
      setState(() {
        _currentDuration = _formatDuration(_calcElapsedTime());
      });
    });
  }

  Duration _calcElapsedTime() => _initialTime.difference(DateTime.now());

  DateTime _parseTimestamp() => DateTime.parse(widget.timestamp);

  // TODO update this to fit your own needs
  String _formatDuration(final Duration duration) => duration.toString();

  @override
  void dispose() {
    _timer?.cancel();

    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Text(_currentDuration);
  }
}

答案 2 :(得分:0)

另一个基于 JayDev's answer 的解决方案有一个属性,表示自“Unix 纪元”以来的毫秒数,例如DateTime.now().millisecondsSinceEpoch 对应于自 1970 年 1 月 1 日以来经过的当前毫秒数。

initialize() 方法中,定时器初始化会延迟自整分钟起经过的秒数,否则,它最初会等待 60 秒来增加计数器。

此小部件仅显示自时间戳起的分钟数,可以应用相同的逻辑来显示更多信息。

class ElapsedTime extends StatefulWidget {
  final int timestamp;

  const _lapsedTime({Key key, this.timestamp}) : super(key: key);
  @override
  __ElapsedTimeState createState() => _ElapsedTimeState();
}

class _ElapsedTimeState extends State<ElapsedTime> {
  Timer _timer;
  int counter; // represents the number of minutes

  @override
  void didUpdateWidget(ElapsedTime oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (widget.timestamp != oldWidget.timestamp) initialize();
  }

  @override
  void initState() {
    super.initState();
    initialize();
  }

  void initialize() {
    counter = calculateElapsedMinutes();
    Future.delayed(Duration(milliseconds: widget.timestamp % 60000))
        .then((_) => setupTimerAndIncrement());
  }

  int calculateElapsedMinutes() =>
      ((DateTime.now().millisecondsSinceEpoch - widget.timestamp) / 60000)
          .floor();

  void setupTimerAndIncrement() {
    if (!mounted) return; //to prevent calling setState() after dispose()
    incrementCounter();
    _timer = Timer.periodic(
        const Duration(minutes: 1), (Timer t) => incrementCounter());
  }

  @override
  Widget build(BuildContext context) => Text(counter.toString());

  void incrementCounter() => setState(() => counter++);

  @override
  void dispose() {
    _timer?.cancel();
    super.dispose();
  }
}