بررسی ساختارهای جدید DateOnly و TimeOnly در دات نت 6
نویسنده: وحید نصیری
تاریخ: ۱۴۰۰/۰۹/۰۶ ۱۲:۳۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
var date = new DateOnly(2020, 04, 20);
var currentDate = DateOnly.FromDateTime(DateTime.Now);
if (DateOnly.TryParse("28/09/1984", new CultureInfo("en-US"), DateTimeStyles.None, out var result))
{
Console.WriteLine(result);
} DateOnly d1 = DateOnly.ParseExact("31 Dec 1980", "dd MMM yyyy", CultureInfo.InvariantCulture); // Custom format
Console.WriteLine(d1.ToString("o", CultureInfo.InvariantCulture)); // "1980-12-31" (ISO 8601 format) var persianCalendar = new PersianCalendar();
DateOnly d2 = new DateOnly(1400, 9, 6, persianCalendar);
Console.WriteLine(d2.ToString("d MMMM yyyy", CultureInfo.InvariantCulture)); var newDate = date.AddDays(1).AddMonths(1).AddYears(1)
public TimeOnly(int hour, int minute) public TimeOnly(int hour, int minute, int second) public TimeOnly(int hour, int minute, int second, int millisecond)
var startTime = new TimeOnly(10, 30);
var endTime = new TimeOnly(13, 00, 00);
var diff = endTime - startTime;
Console.WriteLine($"Hours: {diff.TotalHours}"); TimeSpan ts = endTime.ToTimeSpan();
var currentTime = TimeOnly.FromDateTime(DateTime.Now);
DateTime dt = date.ToDateTime(new TimeOnly(0, 0)); Console.WriteLine(dt);
var isBetween = currentTime.IsBetween(startTime, endTime);
Console.WriteLine($"Current time {(isBetween ? "is" : "is not")} between start and end"); var startTime = new TimeOnly(08, 00);
var endTime = new TimeOnly(09, 00);
Console.WriteLine($"{startTime < endTime}"); TimeOnly time = TimeOnly.ParseExact("5:00 pm", "h:mm tt", CultureInfo.InvariantCulture); // Custom format
Console.WriteLine(time.ToString("T", CultureInfo.InvariantCulture)); // "17:00:00" (long time format) public record DataTypeTest(DateOnly Date, TimeOnly Time);
var date = DateOnly.FromDateTime(DateTime.Now); var time = TimeOnly.FromDateTime(DateTime.Now); var test = new DataTypeTest(date, time); var json = JsonSerializer.Serialize(test);
Serialization and deserialization of 'System.DateOnly' instances are not supported.
public class DateOnlyConverter : JsonConverter<DateOnly>
{
private readonly string _serializationFormat;
public DateOnlyConverter() : this(null)
{ }
public DateOnlyConverter(string? serializationFormat)
{
_serializationFormat = serializationFormat ?? "yyyy-MM-dd";
}
public override DateOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return DateOnly.ParseExact(value!, _serializationFormat, CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, DateOnly value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString(_serializationFormat));
} public class TimeOnlyConverter : JsonConverter<TimeOnly>
{
private readonly string _serializationFormat;
public TimeOnlyConverter() : this(null)
{
}
public TimeOnlyConverter(string? serializationFormat)
{
_serializationFormat = serializationFormat ?? "HH:mm:ss.fff";
}
public override TimeOnly Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
var value = reader.GetString();
return TimeOnly.ParseExact(value!, _serializationFormat, CultureInfo.InvariantCulture);
}
public override void Write(Utf8JsonWriter writer, TimeOnly value, JsonSerializerOptions options)
=> writer.WriteStringValue(value.ToString(_serializationFormat));
} var jsonOptions = new JsonSerializerOptions(JsonSerializerDefaults.Web); jsonOptions.Converters.Add(new DateOnlyConverter()); jsonOptions.Converters.Add(new TimeOnlyConverter()); var json = JsonSerializer.Serialize(test, jsonOptions);
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
await using var context = new MyDbContext();
await context.Database.EnsureDeletedAsync();
await context.Database.EnsureCreatedAsync();
context.Users.Add(new User
{
Name = "John Doe",
Birthday = new(1980, 1, 20),
ShiftStart = new (8, 0),
ShiftLength = TimeSpan.FromHours(8)
});
await context.SaveChangesAsync();
public class MyDbContext : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"...")
.LogTo(Console.WriteLine, LogLevel.Information)
.EnableSensitiveDataLogging();
}
public DbSet<User> Users { get; set; }
}
public class User
{
public int Id { get; set; }
public required string Name { get; set; }
public DateOnly Birthday { get; set; }
public TimeOnly ShiftStart { get; set; }
public TimeSpan ShiftLength { get; set; }
} CREATE TABLE [Users] (
[Id] int NOT NULL IDENTITY,
[Name] nvarchar(max) NULL,
[Birthday] date NOT NULL,
[ShiftStart] time NOT NULL,
[ShiftLength] time NOT NULL,
CONSTRAINT [PK_Users] PRIMARY KEY ([Id])
);