| // Copyright 2014 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| /// A class for making time based operations testable. |
| class SystemClock { |
| /// A const constructor to allow subclasses to be const. |
| const SystemClock(); |
| |
| /// Create a clock with a fixed current time. |
| const factory SystemClock.fixed(DateTime time) = _FixedTimeClock; |
| |
| /// Retrieve the current time. |
| DateTime now() => DateTime.now(); |
| |
| /// Compute the time a given duration ago. |
| DateTime ago(Duration duration) { |
| return now().subtract(duration); |
| } |
| } |
| |
| class _FixedTimeClock extends SystemClock { |
| const _FixedTimeClock(this._fixedTime); |
| |
| final DateTime _fixedTime; |
| |
| @override |
| DateTime now() => _fixedTime; |
| } |
| |
| /// Format time as 'yyyy-MM-dd HH:mm:ss Z' where Z is the difference between the |
| /// timezone of t and UTC formatted according to RFC 822. |
| String formatDateTime(DateTime t) { |
| final String sign = t.timeZoneOffset.isNegative ? '-' : '+'; |
| final Duration tzOffset = t.timeZoneOffset.abs(); |
| final int hoursOffset = tzOffset.inHours; |
| final int minutesOffset = |
| tzOffset.inMinutes - (Duration.minutesPerHour * hoursOffset); |
| assert(hoursOffset < 24); |
| assert(minutesOffset < 60); |
| |
| String twoDigits(int n) => (n >= 10) ? '$n' : '0$n'; |
| return '$t $sign${twoDigits(hoursOffset)}${twoDigits(minutesOffset)}'; |
| } |