Skip to content
This repository was archived by the owner on Apr 17, 2025. It is now read-only.

Commit e703f93

Browse files
author
Angelo Pirola
committed
Refactoring Date Time
1 parent 83a76de commit e703f93

File tree

7 files changed

+75
-18
lines changed

7 files changed

+75
-18
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace NET6CustomLibrary.DateTime.Comparer;
2+
3+
public class DateOnlyComparer : ValueComparer<DateOnly>
4+
{
5+
public DateOnlyComparer() : base(
6+
(d1, d2) => d1.DayNumber == d2.DayNumber,
7+
d => d.GetHashCode())
8+
{
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace NET6CustomLibrary.DateTime.Comparer;
2+
3+
public class TimeOnlyComparer : ValueComparer<TimeOnly>
4+
{
5+
public TimeOnlyComparer() : base(
6+
(t1, t2) => t1.Ticks == t2.Ticks,
7+
t => t.GetHashCode())
8+
{
9+
}
10+
}
Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
1+
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
2+
13
namespace NET6CustomLibrary.DateTime.Converters;
24

3-
public class DateOnlyConverter : JsonConverter<DateOnly>
5+
//public class DateOnlyConverter : JsonConverter<DateOnly>
6+
//{
7+
// public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
8+
// {
9+
// var value = reader.GetString();
10+
// return DateOnly.Parse(value);
11+
// }
12+
13+
// public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
14+
// => writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
15+
//}
16+
17+
public class DateOnlyConverter : ValueConverter<DateOnly, System.DateTime>
418
{
5-
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
19+
public DateOnlyConverter() : base(
20+
dateOnly => dateOnly.ToDateTime(TimeOnly.MinValue),
21+
dateTime => DateOnly.FromDateTime(dateTime))
622
{
7-
var value = reader.GetString();
8-
return DateOnly.Parse(value);
923
}
10-
11-
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
12-
=> writer.WriteStringValue(value.ToString("yyyy-MM-dd"));
1324
}
Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
namespace NET6CustomLibrary.DateTime.Converters;
22

3-
public class TimeOnlyConverter : JsonConverter<TimeOnly>
3+
//public class TimeOnlyConverter : JsonConverter<TimeOnly>
4+
//{
5+
// public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
6+
// {
7+
// var value = reader.GetString();
8+
// return TimeOnly.Parse(value!);
9+
// }
10+
11+
// //public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
12+
// // => writer.WriteStringValue(value.ToString("HH:mm:ss.fff"));
13+
// public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
14+
// => writer.WriteStringValue(value.ToString("HH:mm:ss"));
15+
//}
16+
17+
public class TimeOnlyConverter : ValueConverter<TimeOnly, TimeSpan>
418
{
5-
public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
19+
public TimeOnlyConverter() : base(
20+
timeOnly => timeOnly.ToTimeSpan(),
21+
timeSpan => TimeOnly.FromTimeSpan(timeSpan))
622
{
7-
var value = reader.GetString();
8-
return TimeOnly.Parse(value!);
923
}
10-
11-
//public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
12-
// => writer.WriteStringValue(value.ToString("HH:mm:ss.fff"));
13-
public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
14-
=> writer.WriteStringValue(value.ToString("HH:mm:ss"));
1524
}

src/NET6CustomLibrary/Docs/README-DateTimeOnly.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
# Date and Time only configuration
22

33

4+
## Add the converters and the comparers in the OnModelCreating method of the DbContext
5+
```csharp
6+
modelBuilder.Entity<MyEntity>(builder =>
7+
{
8+
// Date is a DateOnly property and date on database
9+
builder.Property(x => x.Date)
10+
.HasConversion<DateOnlyConverter, DateOnlyComparer>();
11+
12+
// Time is a TimeOnly property and time on database
13+
builder.Property(x => x.Time)
14+
.HasConversion<TimeOnlyConverter, TimeOnlyComparer>();
15+
});
16+
17+
```
18+
419
## Registering services at Startup
520

621
```csharp

src/NET6CustomLibrary/Extensions/DependencyInjection.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ public static IMvcBuilder AddDateTimeJsonOptions(this IMvcBuilder builder)
6464
builder.AddJsonOptions(options =>
6565
{
6666
options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
67-
options.JsonSerializerOptions.Converters.Add(new DateOnlyConverter());
68-
options.JsonSerializerOptions.Converters.Add(new TimeOnlyConverter());
67+
//options.JsonSerializerOptions.Converters.Add(new DateOnlyConverter());
68+
//options.JsonSerializerOptions.Converters.Add(new TimeOnlyConverter());
6969
options.JsonSerializerOptions.Converters.Add(new UtcDateTimeConverter());
7070
});
7171

src/NET6CustomLibrary/GlobalUsings.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
global using Microsoft.AspNetCore.Identity.UI.Services;
1818
global using Microsoft.AspNetCore.Routing;
1919
global using Microsoft.EntityFrameworkCore;
20+
global using Microsoft.EntityFrameworkCore.ChangeTracking;
21+
global using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
2022
global using Microsoft.Extensions.Configuration;
2123
global using Microsoft.Extensions.DependencyInjection;
2224
global using Microsoft.Extensions.Diagnostics.HealthChecks;

0 commit comments

Comments
 (0)