Skip to content
This repository has been archived by the owner on Jan 22, 2023. It is now read-only.

Commit

Permalink
adds method formatDays, supports doubles, refactors to minimize
Browse files Browse the repository at this point in the history
  • Loading branch information
Jonas Schubert committed Jul 14, 2019
1 parent 53e08e0 commit 5d974c4
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 83 deletions.
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
## [0.0.1] - 23.04.2019

* Initial source code

## [0.3.0] - 14.07.2019

* adds method formatDay
* refactors milliSeconds to millis
* reduces dictionary handling for smaller code
* supports doubles
20 changes: 11 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# TimeXt-Dart

[![Version](https://img.shields.io/badge/version-v0.2.0-blue.svg)](https://github.com/TimeXt/TimeXt-Dart/releases/tag/0.2.0)
[![Version](https://img.shields.io/badge/version-v0.3.0-blue.svg)](https://github.com/TimeXt/TimeXt-Dart/releases/tag/0.2.0)
[![Build](https://img.shields.io/badge/build-success-green.svg)](timext)
[![CodeCoverage](https://img.shields.io/badge/codeCoverage-75-yellow.svg)](timext)
[![CodeCoverage](https://img.shields.io/badge/codeCoverage-95-green.svg)](timext)

[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
[![Paypal](https://img.shields.io/badge/paypal-donate-blue.svg)](https://www.paypal.me/GuepardoApps)
Expand All @@ -29,9 +29,9 @@ var threeDays = new TimeXt(3, TimeXtUnit.Day)
var elevenHours = new TimeXt(11, TimeXtUnit.Hour)
var sixMinutes = new TimeXt(6, TimeXtUnit.Minute)
var fiftySeconds = new TimeXt(50, TimeXtUnit.Second)
var hundredMilliseconds = new TimeXt(100, TimeXtUnit.Millisecond)
var hundredMillis = new TimeXt(100, TimeXtUnit.Millis)
var oneDayInMillis = new TimeXt(1, TimeXtUnit.Day).inMilliseconds() // Returns one day in milliseconds
var oneDayInMillis = new TimeXt(1, TimeXtUnit.Day).inMillis() // Returns one day in milliseconds
var twoWeeksInHours = new TimeXt(2, TimeXtUnit.Week).inHours() // Returns two weeks in hours
// Converts the existing 3h-Class into a 180min-Class
Expand All @@ -41,20 +41,22 @@ var duration = new TimeXt(3, TimeXtUnit.Year) + new TimeXt(1, TimeXtUnit.Week) +
var multipliedDuration = 1.5 * duration
var dividedDuration = duration / 2
var isLessTrue = new TimeXt(30, TimeXtUnit.Second) < new TimeXt(30001, TimeXtUnit.Millisecond)
var isLessTrue = new TimeXt(30, TimeXtUnit.Second) < new TimeXt(30001, TimeXtUnit.Millis)
var isLessFalse = new TimeXt(3, TimeXtUnit.Week) < new TimeXt(20, TimeXtUnit.Day)
var isBiggerTrue = new TimeXt(1, TimeXtUnit.Day) > new TimeXt(23, TimeXtUnit.Hour)
var isBiggerFalse = new TimeXt(5, TimeXtUnit.Hour) > new TimeXt(301, TimeXtUnit.Minute)
```

Since version 0.2.0 TimeXt has new extensions for the long type to display this number value in a human readable string format.
Since version 0.3.0 TimeXt supports double numbers.

```dart
var readableStringFromMilliseconds = NumberToString.formatMilliseconds(34325055574) // 56 weeks, 5 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds
var readableStringFromSeconds = NumberToString.formatMilliseconds(4350554) // 7 weeks, 1 day, 8 hours, 29 minutes, 14 seconds
var readableStringFromMinutes = NumberToString.formatMilliseconds(432555) // 42 weeks, 6 days, 9 hours, 15 minutes
var readableStringFromHours = NumberToString.formatMilliseconds(4574) // 27 weeks, 1 day, 14 hours
var readableStringFromMillis = NumberToString.formatMillis(34325055574) // 56 weeks, 5 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds
var readableStringFromSeconds = NumberToString.formatSeconds(4350554) // 7 weeks, 1 day, 8 hours, 29 minutes, 14 seconds
var readableStringFromMinutes = NumberToString.formatMinutes(432555) // 42 weeks, 6 days, 9 hours, 15 minutes
var readableStringFromHours = NumberToString.formatHours(4574) // 27 weeks, 1 day, 14 hours
var readableStringFromDays = NumberToString.formatDays(15.5) // 2 weeks, 1 day, 12 hours
```

## License
Expand Down
102 changes: 38 additions & 64 deletions lib/timext_dart.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,28 @@ class TimeXt {
double inHours() => this._value * this._unit._value / TimeXtUnit.Hour._value;
double inMinutes() => this._value * this._unit._value / TimeXtUnit.Minute._value;
double inSeconds() => this._value * this._unit._value / TimeXtUnit.Second._value;
double inMilliseconds() => this._value * this._unit._value / TimeXtUnit.Millisecond._value;
double inMillis() => this._value * this._unit._value / TimeXtUnit.Millis._value;

TimeXt toYears() => TimeXt(this.inYears(), TimeXtUnit.Year);
TimeXt toWeeks() => TimeXt(this.inWeeks(), TimeXtUnit.Week);
TimeXt toDays() => TimeXt(this.inDays(), TimeXtUnit.Day);
TimeXt toHours() => TimeXt(this.inHours(), TimeXtUnit.Hour);
TimeXt toMinutes() => TimeXt(this.inMinutes(), TimeXtUnit.Minute);
TimeXt toSeconds() => TimeXt(this.inSeconds(), TimeXtUnit.Second);
TimeXt toMilliseconds() => TimeXt(this.inMilliseconds(), TimeXtUnit.Millisecond);
TimeXt toMillis() => TimeXt(this.inMillis(), TimeXtUnit.Millis);

static TimeXt fromDuration(Duration duration, {TimeXtUnit unit: TimeXtUnit.Millisecond}) => TimeXt(duration.inMilliseconds.toDouble() * TimeXtUnit.Millisecond._value / unit._value, unit);
Duration toDuration() => Duration(milliseconds: this.inMilliseconds().toInt());
static TimeXt fromDuration(Duration duration, {TimeXtUnit unit: TimeXtUnit.Millis}) => TimeXt(duration.inMilliseconds.toDouble() * TimeXtUnit.Millis._value / unit._value, unit);
Duration toDuration() => Duration(milliseconds: this.inMillis().toInt());

operator +(TimeXt other) => TimeXt(((this.inMilliseconds() + other.inMilliseconds()) / this._unit._value) * TimeXtUnit.Millisecond._value, this._unit);
operator -(TimeXt other) => TimeXt(((this.inMilliseconds() - other.inMilliseconds()) / this._unit._value) * TimeXtUnit.Millisecond._value, this._unit);
operator *(double other) => TimeXt(this._value * other, this._unit);
operator +(TimeXt other) => TimeXt(((this.inMillis() + other.inMillis()) / this._unit._value) * TimeXtUnit.Millis._value, this._unit);
operator -(TimeXt other) => TimeXt(((this.inMillis() - other.inMillis()) / this._unit._value) * TimeXtUnit.Millis._value, this._unit);
operator *(double other) => other == 0 ? throw new NullThrownError() : TimeXt(this._value * other, this._unit);
operator /(double other) => TimeXt(this._value / other, this._unit);
operator ==(other) => this.inMilliseconds() == other.inMilliseconds();
operator >(other) => this.inMilliseconds() > other.inMilliseconds();
operator <(other) => this.inMilliseconds() < other.inMilliseconds();
operator ==(other) => this.inMillis() == other.inMillis();
operator >(other) => this.inMillis() > other.inMillis();
operator <(other) => this.inMillis() < other.inMillis();

@override int get hashCode => this.inMilliseconds().hashCode;
@override int get hashCode => this.inMillis().hashCode;
@override String toString() => "$_value, $_unit";
}

Expand All @@ -50,15 +50,22 @@ class TimeXtUnit {
static const Hour = const TimeXtUnit._internal(60 * 60 * 1e3);
static const Minute = const TimeXtUnit._internal(60 * 1e3);
static const Second = const TimeXtUnit._internal(1e3);
static const Millisecond = const TimeXtUnit._internal(1e0);
static const Millis = const TimeXtUnit._internal(1e0);
}

class NumberToString {

static List _dictionaryToStringList(Map<String, List<int>> dictionary, int time) {
static List _dictionaryToStringList(double time, double divider) {
List stringList = [];
var dictionary = {
"week": [7 * 24 * 60 * 60 * 1e3, 2 ^ 64],
"day": [24 * 60 * 60 * 1e3, 7],
"hour": [60 * 60 * 1e3, 24],
"minute": [60 * 1e3, 60],
"second": [1e3, 60],
"millisecond": [1, 1e3]
};
dictionary.forEach((key, value) {
var testValue = ((time / value.elementAt(0)) % value.elementAt(1)).floor();
var testValue = ((time / (value.elementAt(0) / divider)) % value.elementAt(1)).floor();
testValue > 1
? stringList.add("$testValue ${key}s")
: testValue > 0
Expand All @@ -68,61 +75,28 @@ class NumberToString {
return stringList.where((value) => value.length > 0).toList();
}

static String formatMilliseconds(int milliseconds) {
var dictionary = {
"week": [7 * 24 * 60 * 60 * 1000, 2 ^ 64],
"day": [24 * 60 * 60 * 1000, 7],
"hour": [60 * 60 * 1000, 24],
"minute": [60 * 1000, 60],
"second": [1000, 60],
"millisecond": [1, 1000]
};

List stringList = _dictionaryToStringList(dictionary, milliseconds);
return stringList.length > 0
? stringList.join(", ")
: "0 milliseconds";
static String formatMillis(double millis) {
List stringList = _dictionaryToStringList(millis, 1);
return stringList.length > 0 ? stringList.join(", ") : "0 milliseconds";
}

static String formatSeconds(int seconds) {
var dictionary = {
"week": [7 * 24 * 60 * 60 * 1, 2 ^ 64],
"day": [24 * 60 * 60 * 1, 7],
"hour": [60 * 60 * 1, 24],
"minute": [60 * 1, 60],
"second": [1, 60]
};
static String formatSeconds(double seconds) {
List stringList = _dictionaryToStringList(seconds, 1e3);
return stringList.length > 0 ? stringList.join(", ") : formatMillis(seconds * 1e3);
}

List stringList = _dictionaryToStringList(dictionary, seconds);
return stringList.length > 0
? stringList.join(", ")
: formatMilliseconds(seconds * 1000);
static String formatMinutes(double minutes) {
List stringList = _dictionaryToStringList(minutes, 60 * 1e3);
return stringList.length > 0 ? stringList.join(", ") : formatSeconds(minutes * 60);
}

static String formatMinutes(int minutes) {
var dictionary = {
"week": [7 * 24 * 60 * 1, 2 ^ 64],
"day": [24 * 60 * 1, 7],
"hour": [60 * 1, 24],
"minute": [1, 60]
};

List stringList = _dictionaryToStringList(dictionary, minutes);
return stringList.length > 0
? stringList.join(", ")
: formatSeconds(minutes * 60);
static String formatHours(double hours) {
List stringList = _dictionaryToStringList(hours, 60 * 60 * 1e3);
return stringList.length > 0 ? stringList.join(", ") : formatMinutes(hours * 60);
}

static String formatHours(int hours) {
var dictionary = {
"week": [7 * 24 * 1, 2 ^ 64],
"day": [24 * 1, 7],
"hour": [1, 24]
};

List stringList = _dictionaryToStringList(dictionary, hours);
return stringList.length > 0
? stringList.join(", ")
: formatMinutes(hours * 60);
static String formatDays(double days) {
List stringList = _dictionaryToStringList(days, 24 * 60 * 60 * 1e3);
return stringList.length > 0 ? stringList.join(", ") : formatMinutes(days * 24);
}
}
2 changes: 1 addition & 1 deletion pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: timext_dart
description: Time extension in Dart.
version: 0.2.0
version: 0.3.0
author:
homepage:

Expand Down
24 changes: 15 additions & 9 deletions test/timext_dart_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -24,27 +24,27 @@ void main() {
expect(new TimeXt(30, TimeXtUnit.Minute) > new TimeXt(1799, TimeXtUnit.Second), true);
expect(new TimeXt(45, TimeXtUnit.Minute) < new TimeXt(2701, TimeXtUnit.Second), true);

expect(new TimeXt(10, TimeXtUnit.Second), new TimeXt(10000, TimeXtUnit.Millisecond));
expect(new TimeXt(20, TimeXtUnit.Second) > new TimeXt(19999, TimeXtUnit.Millisecond), true);
expect(new TimeXt(30, TimeXtUnit.Second) < new TimeXt(30001, TimeXtUnit.Millisecond), true);
expect(new TimeXt(10, TimeXtUnit.Second), new TimeXt(10000, TimeXtUnit.Millis));
expect(new TimeXt(20, TimeXtUnit.Second) > new TimeXt(19999, TimeXtUnit.Millis), true);
expect(new TimeXt(30, TimeXtUnit.Second) < new TimeXt(30001, TimeXtUnit.Millis), true);
});

test('All conversions should work as expected', () {
expect(new TimeXt(1, TimeXtUnit.Year).inDays(), 365);
expect(new TimeXt(14, TimeXtUnit.Day).inWeeks(), 2);
expect(new TimeXt(17520, TimeXtUnit.Hour).inYears(), 2);
expect(new TimeXt(5.5, TimeXtUnit.Minute).inSeconds(), 330);
expect(new TimeXt(1.52, TimeXtUnit.Second).inMilliseconds(), 1520);
expect(new TimeXt(30000, TimeXtUnit.Millisecond).inMinutes(), 0.5);
expect(new TimeXt(1.52, TimeXtUnit.Second).inMillis(), 1520);
expect(new TimeXt(30000, TimeXtUnit.Millis).inMinutes(), 0.5);
});

test('All casts should work as expected', () {
expect(new TimeXt(1, TimeXtUnit.Year).toDays(), new TimeXt(365, TimeXtUnit.Day));
expect(new TimeXt(14, TimeXtUnit.Day).toWeeks(), new TimeXt(2, TimeXtUnit.Week));
expect(new TimeXt(17520, TimeXtUnit.Hour).toYears(), new TimeXt(2, TimeXtUnit.Year));
expect(new TimeXt(5.5, TimeXtUnit.Minute).toSeconds(), new TimeXt(330, TimeXtUnit.Second));
expect(new TimeXt(1.52, TimeXtUnit.Second).toMilliseconds(), new TimeXt(1520, TimeXtUnit.Millisecond));
expect(new TimeXt(30000, TimeXtUnit.Millisecond).toMinutes(), new TimeXt(0.5, TimeXtUnit.Minute));
expect(new TimeXt(1.52, TimeXtUnit.Second).toMillis(), new TimeXt(1520, TimeXtUnit.Millis));
expect(new TimeXt(30000, TimeXtUnit.Millis).toMinutes(), new TimeXt(0.5, TimeXtUnit.Minute));
});

test('Duration casts should work as expected', () {
Expand All @@ -53,14 +53,20 @@ void main() {
});

test('All NumberToString methods should work as expected', () {
expect(NumberToString.formatMilliseconds(0), "0 milliseconds");
expect(NumberToString.formatMillis(0), "0 milliseconds");
expect(NumberToString.formatSeconds(0), "0 milliseconds");
expect(NumberToString.formatMinutes(0), "0 milliseconds");
expect(NumberToString.formatHours(0), "0 milliseconds");
expect(NumberToString.formatDays(0), "0 milliseconds");

expect(NumberToString.formatMilliseconds(34325055574), "56 weeks, 5 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds");
expect(NumberToString.formatMillis(34325055574), "56 weeks, 5 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds");
expect(NumberToString.formatSeconds(4350554), "7 weeks, 1 day, 8 hours, 29 minutes, 14 seconds");
expect(NumberToString.formatSeconds(90.250), "1 minute, 30 seconds, 250 milliseconds");
expect(NumberToString.formatMinutes(432555), "42 weeks, 6 days, 9 hours, 15 minutes");
expect(NumberToString.formatMinutes(0.5), "30 seconds");
expect(NumberToString.formatHours(4574), "27 weeks, 1 day, 14 hours");
expect(NumberToString.formatHours(49.25), "2 days, 1 hour, 15 minutes");
expect(NumberToString.formatDays(23), "3 weeks, 2 days");
expect(NumberToString.formatDays(15.5), "2 weeks, 1 day, 12 hours");
});
}

0 comments on commit 5d974c4

Please sign in to comment.