Skip to content

Commit 93d7865

Browse files
committed
feat: add datetime calculator methods
1 parent 3fd01c2 commit 93d7865

File tree

3 files changed

+145
-1
lines changed

3 files changed

+145
-1
lines changed
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
namespace Cnblogs.Architecture.Ddd.Domain.Abstractions;
2+
3+
/// <summary>
4+
/// Handy calculator for DateTime
5+
/// </summary>
6+
public static class DateTimeOffsetCalculator
7+
{
8+
/// <summary>
9+
/// Get a new <see cref="DateTimeOffset"/> with time set to 0:00:00
10+
/// </summary>
11+
/// <param name="dateTime">Input <see cref="DateTimeOffset"/>.</param>
12+
/// <returns></returns>
13+
public static DateTimeOffset StartOfTheDay(this DateTimeOffset dateTime)
14+
{
15+
return new DateTimeOffset(dateTime.Date, dateTime.Offset);
16+
}
17+
18+
/// <summary>
19+
/// Get a new <see cref="DateTimeOffset"/> with time set to 23:59:59.999.
20+
/// </summary>
21+
/// <param name="dateTime"></param>
22+
/// <returns></returns>
23+
public static DateTimeOffset EndOfTheDay(this DateTimeOffset dateTime)
24+
{
25+
return StartOfTheDay(dateTime).AddDays(1).AddMilliseconds(-1);
26+
}
27+
28+
/// <summary>
29+
/// Get a new <see cref="DateTimeOffset"/> that set the start of a week for the given date.
30+
/// </summary>
31+
/// <param name="dateTime"></param>
32+
/// <returns></returns>
33+
public static DateTimeOffset StartOfTheWeek(this DateTimeOffset dateTime)
34+
{
35+
var monday = dateTime.DayOfWeek switch
36+
{
37+
DayOfWeek.Monday => dateTime,
38+
DayOfWeek.Sunday => dateTime.AddDays(-6),
39+
_ => dateTime.AddDays(-(int)(dateTime.DayOfWeek - 1))
40+
};
41+
42+
return monday.StartOfTheDay();
43+
}
44+
45+
/// <summary>
46+
/// Get a new <see cref="DateTimeOffset"/> that set to the end of a week for the given date.
47+
/// </summary>
48+
/// <param name="dateTime"></param>
49+
/// <returns></returns>
50+
public static DateTimeOffset EndOfTheWeek(this DateTimeOffset dateTime)
51+
{
52+
var sunday = dateTime.DayOfWeek switch
53+
{
54+
DayOfWeek.Sunday => dateTime,
55+
DayOfWeek.Monday => dateTime.AddDays(6),
56+
_ => dateTime.AddDays((int)(7 - dateTime.DayOfWeek))
57+
};
58+
59+
return sunday.EndOfTheDay();
60+
}
61+
62+
/// <summary>
63+
/// Check whether two <see cref="DateTimeOffset"/> is in same date.
64+
/// </summary>
65+
/// <param name="left">First <see cref="DateTimeOffset"/> to check.</param>
66+
/// <param name="right">Second <see cref="DateTimeOffset"/> to check.</param>
67+
/// <returns></returns>
68+
public static bool IsInSameDate(this DateTimeOffset left, DateTimeOffset right)
69+
{
70+
return left.Year == right.Year && left.DayOfYear == right.DayOfYear;
71+
}
72+
}

src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DefaultDateTimeProvider.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,52 @@ public DateTimeOffset Now()
1111
return DateTimeOffset.Now;
1212
}
1313

14+
/// <inheritdoc />
15+
public DateTimeOffset Yesterday()
16+
{
17+
return Today().AddDays(-1);
18+
}
19+
20+
/// <inheritdoc />
21+
public DateTimeOffset EndOfYesterday()
22+
{
23+
return Today().AddDays(-1).EndOfTheDay();
24+
}
25+
1426
/// <inheritdoc />
1527
public DateTimeOffset Today()
1628
{
1729
var now = Now();
1830
return new DateTimeOffset(now.Year, now.Month, now.Day, 0, 0, 0, now.Offset);
1931
}
2032

33+
/// <inheritdoc />
34+
public DateTimeOffset EndOfToday()
35+
{
36+
return Today().EndOfTheDay();
37+
}
38+
39+
/// <inheritdoc />
40+
public DateTimeOffset Tomorrow()
41+
{
42+
return Today().AddDays(1);
43+
}
44+
45+
/// <inheritdoc />
46+
public DateTimeOffset EndOfTomorrow()
47+
{
48+
return Today().AddDays(1).EndOfTheDay();
49+
}
50+
2151
/// <inheritdoc />
2252
public long UnixSeconds()
2353
{
2454
return Now().ToUnixTimeSeconds();
2555
}
56+
57+
/// <inheritdoc />
58+
public long UnixMilliseconds()
59+
{
60+
return Now().ToUnixTimeMilliseconds();
61+
}
2662
}

src/Cnblogs.Architecture.Ddd.Domain.Abstractions/IDateTimeProvider.cs

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,50 @@ public interface IDateTimeProvider
1212
DateTimeOffset Now();
1313

1414
/// <summary>
15-
/// Get <see cref="DateTimeOffset"/> today's date.
15+
/// Get <see cref="DateTimeOffset"/> of yesterday's date.
16+
/// </summary>
17+
/// <returns></returns>
18+
DateTimeOffset Yesterday();
19+
20+
/// <summary>
21+
/// Get <see cref="DateTimeOffset"/> of yesterday's date with time set to 23:59:59.999.
22+
/// </summary>
23+
/// <returns></returns>
24+
DateTimeOffset EndOfYesterday();
25+
26+
/// <summary>
27+
/// Get <see cref="DateTimeOffset"/> of today's date.
1628
/// </summary>
1729
/// <returns>Today's date.</returns>
1830
DateTimeOffset Today();
1931

32+
/// <summary>
33+
/// Get <see cref="DateTimeOffset"/> of today's date with time set to 23:59:59.999.
34+
/// </summary>
35+
/// <returns></returns>
36+
DateTimeOffset EndOfToday();
37+
38+
/// <summary>
39+
/// Get <see cref="DateTimeOffset"/> of tomorrow's date with time set to 0:00:00.000.
40+
/// </summary>
41+
/// <returns></returns>
42+
DateTimeOffset Tomorrow();
43+
44+
/// <summary>
45+
/// Get <see cref="DateTimeOffset"/> of tomorrow's date with time set to 23:59:59.000.
46+
/// </summary>
47+
/// <returns></returns>
48+
DateTimeOffset EndOfTomorrow();
49+
2050
/// <summary>
2151
/// Get number of seconds that have elapsed since 1970-01-01T00:00:00Z.
2252
/// </summary>
2353
/// <returns>The number of seconds that have elapsed since 1970-01-01T00:00:00Z.</returns>
2454
long UnixSeconds();
55+
56+
/// <summary>
57+
/// Get number of milliseconds that have elapsed since 1970-01-01T00:00:00Z.
58+
/// </summary>
59+
/// <returns></returns>
60+
long UnixMilliseconds();
2561
}

0 commit comments

Comments
 (0)