Skip to content

Commit 0c1d8db

Browse files
Adds DateTimeExtensions
1 parent 05df0c7 commit 0c1d8db

File tree

3 files changed

+257
-0
lines changed

3 files changed

+257
-0
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
using CommonUtilitiesCSharp.Extensions;
2+
3+
namespace CommonUtilitiesCSharp.UnitTests.Extensions
4+
{
5+
public class DateTimeExtensionTests
6+
{
7+
#region SetHour
8+
[Test]
9+
public void SetHours_ReturnsInstanceWithNewHour_ForEarlierHour()
10+
{
11+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
12+
13+
var result = dateTime.SetHour(7);
14+
15+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 7, 30, 30)));
16+
}
17+
18+
[Test]
19+
public void SetHours_ReturnsInstanceWithNewHour_ForLaterHour()
20+
{
21+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
22+
23+
var result = dateTime.SetHour(11);
24+
25+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 11, 30, 30)));
26+
}
27+
28+
[Test]
29+
public void SetHours_ReturnsInstanceWithNewHour_ForMidnight()
30+
{
31+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
32+
33+
var result = dateTime.SetHour(0);
34+
35+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 0, 30, 30)));
36+
}
37+
38+
[Test]
39+
public void SetHours_ReturnsInstanceWithNewHour_For23h()
40+
{
41+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
42+
43+
var result = dateTime.SetHour(23);
44+
45+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 23, 30, 30)));
46+
}
47+
48+
[Test]
49+
public void SetHours_Throws_ForNegativeHour()
50+
{
51+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
52+
53+
Assert.Throws<ArgumentOutOfRangeException>(() => dateTime.SetHour(-1));
54+
}
55+
56+
[Test]
57+
public void SetHours_Throws_ForOver23h()
58+
{
59+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
60+
61+
Assert.Throws<ArgumentOutOfRangeException>(() => dateTime.SetHour(24));
62+
}
63+
#endregion SetHour
64+
65+
#region SetMinute
66+
[Test]
67+
public void SetMinutes_ReturnsInstanceWithNewMinute_ForEarlierMinute()
68+
{
69+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
70+
71+
var result = dateTime.SetMinute(15);
72+
73+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 15, 30)));
74+
}
75+
76+
[Test]
77+
public void SetMinutes_ReturnsInstanceWithNewMinute_ForLaterMinute()
78+
{
79+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
80+
81+
var result = dateTime.SetMinute(45);
82+
83+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 45, 30)));
84+
}
85+
86+
[Test]
87+
public void SetMinutes_ReturnsInstanceWithNewMinute_ForZero()
88+
{
89+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
90+
91+
var result = dateTime.SetMinute(0);
92+
93+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 00, 30)));
94+
}
95+
96+
[Test]
97+
public void SetMinutes_ReturnsInstanceWithNewMinute_For59m()
98+
{
99+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
100+
101+
var result = dateTime.SetMinute(59);
102+
103+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 59, 30)));
104+
}
105+
106+
[Test]
107+
public void SetMinutes_Throws_ForNegativeMinute()
108+
{
109+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
110+
111+
Assert.Throws<ArgumentOutOfRangeException>(() => dateTime.SetMinute(-1));
112+
}
113+
114+
[Test]
115+
public void SetMinutes_Throws_ForOver59m()
116+
{
117+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
118+
119+
Assert.Throws<ArgumentOutOfRangeException>(() => dateTime.SetMinute(60));
120+
}
121+
#endregion SetMinute
122+
123+
#region SetSeconds
124+
[Test]
125+
public void SetSeconds_ReturnsInstanceWithNewSeconds_ForEarlierSeconds()
126+
{
127+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
128+
129+
var result = dateTime.SetSeconds(15);
130+
131+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 30, 15)));
132+
}
133+
134+
[Test]
135+
public void SetSeconds_ReturnsInstanceWithNewSeconds_ForLaterSeconds()
136+
{
137+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
138+
139+
var result = dateTime.SetSeconds(45);
140+
141+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 30, 45)));
142+
}
143+
144+
[Test]
145+
public void SetSeconds_ReturnsInstanceWithNewSeconds_ForZero()
146+
{
147+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
148+
149+
var result = dateTime.SetSeconds(0);
150+
151+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 30, 00)));
152+
}
153+
154+
[Test]
155+
public void SetSeconds_ReturnsInstanceWithNewSeconds_For59s()
156+
{
157+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
158+
159+
var result = dateTime.SetSeconds(59);
160+
161+
Assert.That(result, Is.EqualTo(new DateTime(2025, 11, 01, 10, 30, 59)));
162+
}
163+
164+
[Test]
165+
public void SetSeconds_Throws_ForNegativeSeconds()
166+
{
167+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
168+
169+
Assert.Throws<ArgumentOutOfRangeException>(() => dateTime.SetSeconds(-1));
170+
}
171+
172+
[Test]
173+
public void SetSeconds_Throws_ForOver59s()
174+
{
175+
var dateTime = new DateTime(2025, 11, 01, 10, 30, 30);
176+
177+
Assert.Throws<ArgumentOutOfRangeException>(() => dateTime.SetSeconds(60));
178+
}
179+
#endregion SetSeconds
180+
}
181+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace CommonUtilitiesCSharp.Core
2+
{
3+
public interface ISingleton<T> where T: class
4+
{
5+
//static abstract T Instance { get; }
6+
7+
}
8+
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
namespace CommonUtilitiesCSharp.Extensions
2+
{
3+
/// <summary>
4+
/// Static class containing extension methods for <see cref="DateTime"/>.
5+
/// </summary>
6+
public static class DateTimeExtensions
7+
{
8+
/// <summary>
9+
/// Returns a new <see cref="DateTime"/> as a copy of this instance, where the hour is set to the specified number.
10+
/// </summary>
11+
/// <param name="dateTime">Source <see cref="DateTime"/> instance.</param>
12+
/// <param name="hour">Target hour to set.</param>
13+
/// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="hour"/> is not between 0 and 23.</exception>
14+
/// <returns>Returns a new <see cref="DateTime"/> as a copy of this instance, where the hour is set to the specified number.</returns>
15+
public static DateTime SetHour(this DateTime dateTime, int hour)
16+
{
17+
if (hour < 0 || hour > 23)
18+
{
19+
throw new ArgumentOutOfRangeException(nameof(hour), $"{nameof(hour)} must be between 0 and 23.");
20+
}
21+
22+
var currentHours = dateTime.Hour;
23+
var resultHours = hour - currentHours;
24+
25+
return dateTime.AddHours(resultHours);
26+
}
27+
28+
/// <summary>
29+
/// Returns a new <see cref="DateTime"/> as a copy of this instance, where the minute is set to the specified number.
30+
/// </summary>
31+
/// <param name="dateTime">Source <see cref="DateTime"/> instance.</param>
32+
/// <param name="minute">Target minute to set.</param>
33+
/// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="minute"/> is not between 0 and 59.</exception>
34+
/// <returns>Returns a new <see cref="DateTime"/> as a copy of this instance, where the minute is set to the specified number.</returns>
35+
public static DateTime SetMinute(this DateTime dateTime, int minute)
36+
{
37+
if (minute < 0 || minute > 59)
38+
{
39+
throw new ArgumentOutOfRangeException(nameof(minute), $"{nameof(minute)} must be between 1 and 59.");
40+
}
41+
42+
var currentMinute = dateTime.Minute;
43+
var resultMinute = minute - currentMinute;
44+
45+
return dateTime.AddMinutes(resultMinute);
46+
}
47+
48+
/// <summary>
49+
/// Returns a new <see cref="DateTime"/> as a copy of this instance, where the seconds are set to the specified number.
50+
/// </summary>
51+
/// <param name="dateTime">Source <see cref="DateTime"/> instance.</param>
52+
/// <param name="seconds">Target seconds to set.</param>
53+
/// <exception cref="ArgumentOutOfRangeException">Thrown if <paramref name="seconds"/> is not between 1 and 59.</exception>
54+
/// <returns>Returns a new <see cref="DateTime"/> as a copy of this instance, where the seconds are set to the specified number.</returns>
55+
public static DateTime SetSeconds(this DateTime dateTime, int seconds)
56+
{
57+
if (seconds < 0 || seconds > 59)
58+
{
59+
throw new ArgumentOutOfRangeException(nameof(seconds), $"{nameof(seconds)} must be between 1 and 59.");
60+
}
61+
62+
var currentSeconds = dateTime.Second;
63+
var resultSeconds = seconds - currentSeconds;
64+
65+
return dateTime.AddSeconds(resultSeconds);
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)