Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature/add support for format #16

Merged
merged 14 commits into from Oct 4, 2020
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