| // 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)}'; | |
| } |