Skip to content

Commit

Permalink
Merge pull request #16 from bolorundurowb/feature/add-support-for-format
Browse files Browse the repository at this point in the history
feature/add support for format
  • Loading branch information
bolorundurowb committed Oct 4, 2020
2 parents 3bf9822 + fee5fc3 commit 7b64c87
Show file tree
Hide file tree
Showing 14 changed files with 133 additions and 66 deletions.
14 changes: 12 additions & 2 deletions README.md
Expand Up @@ -124,8 +124,9 @@ date.Last(DayOfWeek.Friday) // 25/04/2008 08:30:52
```
Returns the 3rd previous Thursday.
```csharp
date.Next(DayOfWeek.Thursday, 3) // 10/04/2008 08:30:52
date.Last(DayOfWeek.Thursday, 3) // 10/04/2008 08:30:52
```

#### Final
Fluently returns the final day of the week in a month or year given a date

Expand All @@ -136,4 +137,13 @@ date.Final().Monday().InMonth(); // 26/05/2008 00:00:00
// final sunday in 2008
date.Final().Sunday().InYear(); // 28/12/2008 00:00:00
```
```

#### Format
Fluently returns a formatted string for a given date. if no format string is provided the format defaults to the `ISO-8601` standard with no fractional seconds.

```csharp
var dateTime = new DateTime(1971, 01, 01, 0, 0, 0, DateTimeKind.Utc);
date.Format(); // 1971-01-01T00:00:00+00:00
date.Format("yyyy MMM dd"); // 1971 Jan 01
```
23 changes: 0 additions & 23 deletions src/Enums/SeekPosition.cs

This file was deleted.

5 changes: 3 additions & 2 deletions src/FinalDays.cs
Expand Up @@ -6,7 +6,8 @@ namespace moment.net
{
public class FinalDays
{
DateTime dateTime;
readonly DateTime dateTime;

public FinalDays(DateTime dateTime)
{
this.dateTime = dateTime;
Expand All @@ -17,7 +18,7 @@ public FinalSpan Monday()
return new FinalSpan(dateTime, DayOfWeek.Monday);
}

public FinalSpan Teusday()
public FinalSpan Tuesday()
{
return new FinalSpan(dateTime, DayOfWeek.Tuesday);
}
Expand Down
26 changes: 14 additions & 12 deletions src/FinalSpan.cs
Expand Up @@ -6,35 +6,37 @@ namespace moment.net
{
public class FinalSpan
{
private DateTime _dt;
private DayOfWeek _dow;
private DateTime _dateTime;
private readonly DayOfWeek _dayOfWeek;

public FinalSpan(DateTime dateTime, DayOfWeek dayOfWeek)
{
this._dt = dateTime;
this._dow = dayOfWeek;
_dateTime = dateTime;
_dayOfWeek = dayOfWeek;
}

public DateTime InMonth()
{
int m = _dt.Month;
var month = _dateTime.Month;
// only loop through the last seven days of the month
_dt = new DateTime(_dt.Year,_dt.Month, (DateTime.DaysInMonth(_dt.Year, _dt.Month)-7), 0, 0, 0, _dt.Kind);
while (_dt.Month == m)
_dateTime = new DateTime(_dateTime.Year, _dateTime.Month, (DateTime.DaysInMonth(_dateTime.Year, _dateTime.Month) - 7), 0, 0, 0, _dateTime.Kind);
while (_dateTime.Month == month)
{
if(_dt.DayOfWeek == _dow)
if (_dateTime.DayOfWeek == _dayOfWeek)
{
return _dt;
return _dateTime;
}
_dt = _dt.AddDays(1);

_dateTime = _dateTime.AddDays(1);
}

return DateTime.MaxValue;
}

public DateTime InYear()
{
var dt = new DateTime(_dt.Year, 12, (DateTime.DaysInMonth(_dt.Year, 12) - 7), 0, 0, 0, _dt.Kind);
return new FinalSpan(dt, _dow).InMonth();
var dateTime = new DateTime(_dateTime.Year, 12, (DateTime.DaysInMonth(_dateTime.Year, 12) - 7), 0, 0, 0, _dateTime.Kind);
return new FinalSpan(dateTime, _dayOfWeek).InMonth();
}
}
}
22 changes: 20 additions & 2 deletions src/RelativeTime.cs
Expand Up @@ -25,6 +25,7 @@ public static DateTime Next(this DateTime This, DayOfWeek dayOfWeek)
{
This = This.AddDays(1);
}

return This;
}

Expand All @@ -40,6 +41,7 @@ public static DateTime Next(this DateTime This, DayOfWeek dayOfWeek, int count)
{
This = This.Next(dayOfWeek);
}

return This;
}

Expand All @@ -57,6 +59,7 @@ public static DateTime Last(this DateTime This, DayOfWeek dayOfWeek)
{
This = This.AddDays(-1);
}

return This;
}

Expand All @@ -72,6 +75,7 @@ public static DateTime Last(this DateTime This, DayOfWeek dayOfWeek, int count)
{
This = This.Last(dayOfWeek);
}

return This;
}

Expand Down Expand Up @@ -109,7 +113,7 @@ public static DateTime StartOf(this DateTime This, DateTimeAnchor timeAnchor, Cu
case DateTimeAnchor.Hour:
return new DateTime(This.Year, This.Month, This.Day, This.Hour, 0, 0, 0, This.Kind);
case DateTimeAnchor.Day:
return new DateTime(This.Year, This.Month, This.Day,0,0,0,0, This.Kind);
return new DateTime(This.Year, This.Month, This.Day, 0, 0, 0, 0, This.Kind);
case DateTimeAnchor.Week:
var tmp = This.FirstDateInWeek(cultureInfo);
return new DateTime(tmp.Year, tmp.Month, tmp.Day, 0, 0, 0, 0, This.Kind);
Expand Down Expand Up @@ -418,5 +422,19 @@ public static DateTime LastDateInWeek(this DateTime dayInWeek, CultureInfo cultu
var firstDayInWeek = FirstDateInWeek(dayInWeek, cultureInfo);
return firstDayInWeek.AddDays(6);
}

/// <summary>
/// Returns a formatted date string
/// If no format is specified it returns an ISO-8601 string with no fractional seconds
/// </summary>
/// <param name="dateTime">DateTime instance</param>
/// <param name="format">Optional format string</param>
/// <param name="cultureInfo">The culture information to be formatted with</param>
/// <returns>The formatted date string</returns>
public static string Format(this DateTime dateTime, string format = null, CultureInfo cultureInfo = null)
{
format = string.IsNullOrEmpty(format) ? "yyyy-MM-ddTHH:mm:sszzz" : format;
return dateTime.ToString(format, cultureInfo ?? CultureInfo.CurrentCulture);
}
}
}
}
10 changes: 7 additions & 3 deletions src/moment.net.csproj
Expand Up @@ -2,19 +2,23 @@

<PropertyGroup>
<TargetFrameworks>netstandard1.1;netstandard2.0</TargetFrameworks>
<PackageVersion>1.3.0</PackageVersion>
<PackageVersion>1.3.1</PackageVersion>
<Title>moment.net</Title>
<Authors>bolorundurowb yemikudaisi pengelbrecht2627</Authors>
<Description>A library aimed at adding in some relevant functionality as seen in moment.js that is missing in the System.DateTime construct</Description>
<Copyright>(c) 2019</Copyright>
<Copyright>(c) 2020</Copyright>
<PackageProjectUrl>https://github.com/bolorundurowb/moment.net</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/bolorundurowb/moment.net/blob/master/LICENSE</PackageLicenseUrl>
<RepositoryUrl>https://github.com/bolorundurowb/moment.net</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>moment datetime relative time</PackageTags>
<PackageReleaseNotes>Fixes the issue with the datetime kind not being persisted</PackageReleaseNotes>
<PackageReleaseNotes>- add support for the format method
- fix typographic errors</PackageReleaseNotes>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<AssemblyVersion>1.3.1</AssemblyVersion>
<FileVersion>1.3.1</FileVersion>
<NeutralLanguage>en-NG</NeutralLanguage>
</PropertyGroup>

</Project>
12 changes: 6 additions & 6 deletions tests/EndOf.Tests.cs
Expand Up @@ -12,47 +12,47 @@ public class EndOfTests
[Test]
public void EndOfMinuteTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.EndOf(DateTimeAnchor.Minute).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("01/05/2008 08:30:59");
date.EndOf(DateTimeAnchor.Minute).Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void EndOfHourTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.EndOf(DateTimeAnchor.Hour).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("01/05/2008 08:59:59");
date.EndOf(DateTimeAnchor.Hour).Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void EndOfDayTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.EndOf(DateTimeAnchor.Day).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("01/05/2008 23:59:59");
date.EndOf(DateTimeAnchor.Day).Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void EndOfWeekTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.EndOf(DateTimeAnchor.Week).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("03/05/2008 23:59:59");
date.EndOf(DateTimeAnchor.Week).Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void EndOfMonthTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.EndOf(DateTimeAnchor.Month).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("31/05/2008 23:59:59");
date.EndOf(DateTimeAnchor.Month).Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void EndOfYearTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.EndOf(DateTimeAnchor.Year).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("31/12/2008 23:59:59");
date.EndOf(DateTimeAnchor.Year).Kind.ShouldBe(DateTimeKind.Utc);
}
Expand Down
6 changes: 3 additions & 3 deletions tests/Final.Test.cs → tests/Final.Tests.cs
Expand Up @@ -5,22 +5,22 @@

namespace moment.net.Tests
{
public class Final
public class FinalTests
{
string dateString = "5/1/2008 8:30:52Z AM";

[Test]
public void FinalInMonthTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.Final().Monday().InMonth().ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("26/05/2008 00:00:00");
date.Final().Monday().InMonth().Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void FinalInYearTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.Final().Sunday().InYear().ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("28/12/2008 00:00:00");
date.Final().Sunday().InYear().Kind.ShouldBe(DateTimeKind.Utc);
}
Expand Down
4 changes: 2 additions & 2 deletions tests/FirstLastDateInWeek.Tests.cs
Expand Up @@ -12,15 +12,15 @@ public class FirstLastDateInWeek
[Test]
public void FirstDateInWeekTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.FirstDateInWeek().ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("27/04/2008 00:00:00");
date.FirstDateInWeek().Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void LastDateInWeekTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.LastDateInWeek().ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("03/05/2008 00:00:00");
date.LastDateInWeek().Kind.ShouldBe(DateTimeKind.Utc);
}
Expand Down
42 changes: 42 additions & 0 deletions tests/Format.Tests.cs
@@ -0,0 +1,42 @@
using System;
using System.Globalization;
using NUnit.Framework;
using Shouldly;

namespace moment.net.Tests
{
[TestFixture]
public class FormatTests
{
[Test]
public void FormatShouldReturnIsoStringWithNoSpecifiedFormatString()
{
var date = new DateTime(2020, 10, 04, 0, 0, 0, DateTimeKind.Utc);
var formattedDate = date.Format();

formattedDate
.ShouldBe("2020-10-04T00:00:00+00:00");
}

[Test]
public void FormatShouldReturnIsoStringWithSpecifiedFormatString()
{
var date = new DateTime(2020, 10, 04, 0, 0, 0, DateTimeKind.Utc);
var formattedDate = date.Format("yyy MMM hh");

formattedDate
.ShouldBe("2020 Oct 12");
}

[Test]
public void FormatShouldReturnIsoStringWithSpecifiedFormatStringAndCulture()
{
var date = new DateTime(2020, 10, 04, 0, 0, 0, DateTimeKind.Utc);
var culture = new CultureInfo("fr-CA", false);
var formattedDate = date.Format("yyy MMM hh", culture);

formattedDate
.ShouldBe("2020 oct. 12", Case.Insensitive);
}
}
}
4 changes: 2 additions & 2 deletions tests/Last.Tests.cs
Expand Up @@ -11,15 +11,15 @@ public class Last
[Test]
public void LastDayOfWeekTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.Last(DayOfWeek.Thursday).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("24/04/2008 08:30:52");
date.Last(DayOfWeek.Thursday).Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void LastNthDayOfWeekTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.Last(DayOfWeek.Thursday, 3).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("10/04/2008 08:30:52");
date.Last(DayOfWeek.Thursday, 3).Kind.ShouldBe(DateTimeKind.Utc);
}
Expand Down
4 changes: 2 additions & 2 deletions tests/Next.Tests.cs
Expand Up @@ -12,15 +12,15 @@ public class Next
[Test]
public void NextDayOfWeekTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.Next(DayOfWeek.Thursday).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("08/05/2008 08:30:52");
date.Next(DayOfWeek.Thursday).Kind.ShouldBe(DateTimeKind.Utc);
}

[Test]
public void NextNthDayOfWeekTest()
{
DateTime date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
var date = DateTime.Parse(dateString, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.AdjustToUniversal);
date.Next(DayOfWeek.Thursday, 3).ToString("dd/MM/yyyy HH:mm:ss").ShouldBe("22/05/2008 08:30:52");
date.Next(DayOfWeek.Thursday, 3).Kind.ShouldBe(DateTimeKind.Utc);
}
Expand Down

0 comments on commit 7b64c87

Please sign in to comment.