blob: dc989df383cd2d9e11d9880e4867d1648ba4c660 [file] [log] [blame]
// 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)}';
}