.NET 6’daki yenilikler [9]: DateOnly ve TimeOnly veri türleri

Womanne

Member
Karma türün yanı sıra .NET geliştirici topluluğunun arzusu DateTime Örneğin, doğum günleri için bir tarih kaydedebileceğiniz veya ayrı ayrı tarihler veya bir saat kiralayabileceğiniz veri türleri elde etmek, özellikle bunun için genellikle ayrı veri türlerine sahip olan veritabanı yönetim sistemleriyle bağlantılı olarak çok eskidir.


Şimdi .NET 6.0’da şu ek temel veri türleri var:

  • System.DateOnly: Yalnızca bir tarih kaydet
  • System.TimeOnly: Yalnızca bir kez kaydet
Tüm .NET geliştiricileri adlandırmayı sevmez; bazıları basitçe Date Ve Time amaçlanan “Solo” eklentisi olmadan (ayrıca GitHub dizisine bakın). Ancak yerleşik veri türüyle çakışmalar olacaktır. Date Visual Basic .NET’te ve buna karşı başka argümanlar da vardı.

DateOnly Ve TimeOnly Ben gibiyim DateTime değer semantiği ile yapılar (yapılar) olarak ilan edildi.

Boyutlar ve değer aralıkları iki sınıfın kendisi tarafından sağlanabilir.

unsafe
{
Console.WriteLine($"DateTime: {sizeof(DateTime)} Bytes");
Console.WriteLine(DateTime.MinValue + "->" + DateTime.MaxValue);
Console.WriteLine($"DateOnly: {sizeof(DateOnly)} Bytes");
Console.WriteLine(DateOnly.MinValue + "->" + DateOnly.MaxValue);
Console.WriteLine($"TimeOnly: {sizeof(TimeOnly)} Bytes");
Console.WriteLine(TimeOnly.MinValue + "->" + TimeOnly.MaxValue);
}

Bu kod çıktıları:


DateTime: 8 Bytes
01.01.0001 00:00:00->31.12.9999 23:59:59
DateOnly: 4 Bytes
01.01.0001->31.12.9999
TimeOnly: 8 Bytes
00:00->23:59

Her iki yeni veri türü de başlangıç değerini ayarlamak için yapıcı parametrelerine sahiptir:

DateOnly d1 = new DateOnly(2021, 11, 9); // 9.11.2021
TimeOnly t1 = new TimeOnly(11, 59, 20, 10); // 11:59:20.10

aynen DateTime statik var TryParse() karakter dizilerini dönüştürme yöntemi:

DateOnly d2;
if (DateOnly.TryParse("09.11.2021", out d2))
{ Console.WriteLine(".NET 6 erscheint am " +d2); }
TimeOnly t2;
if (TimeOnly.TryParse("11:59:20.10", out t2))
{ Console.WriteLine(t2);

Her iki veri türü de DateTime’a ve DateTime’dan dönüştürmeye izin verir:

// DateOnly und TimeOnly aus DateTime
DateOnly d2 = DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine($"Heute ist der {d1}.");
TimeOnly t2 = TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine($"Es ist jetzt {t2}.");

// DateOnly und TimeOnly zu DateTime zusammensetzen
DateTime d3 = d2.ToDateTime(t2);


Değerler şu yöntemlerle değiştirilebilir:

// Datum und Zeit verändern
var d6 = new DateOnly(2021, 11, 9);
Console.WriteLine("Eine Woche später: " + d6.AddDays(7));
TimeOnly t6 = new TimeOnly(11, 59, 20, 10); // 11:59:20.10
Console.WriteLine("15 Minuten zuvor: " + t6.AddMinutes(-15));

benimle gelebilirsin TimeOnly Bir zaman aralığı hesaplayın:

// Mit Zeit rechnen
var t5 = new TimeOnly(17, 0, 0);
TimeSpan restarbeitszeit = t5 - TimeOnly.FromDateTime(DateTime.Now);
Console.WriteLine(restarbeitszeit + " bis zum Feierabend");

Ama ne yazık ki işe yaramıyor DateOnly:

// Mit Datum rechnen
var d5 = new DateOnly(2021, 11, 9);
TimeSpan tage = d5 - DateOnly.FromDateTime(DateTime.Now);
Console.WriteLine(tage + " bis zum Erscheinen von .NET 6");

Burada eksi operatörü aşırı yüklenmemiş: Operator '-' cannot be applied to operands of type 'DateOnly' and 'DateOnly'

içinde TimeOnly bir yöntem var IsBetween()belirli bir saatin bir zaman penceresi içinde olup olmadığını kontrol eder:

var t9 = new TimeOnly(9, 0);
var t17 = new TimeOnly(17, 0);
var now = TimeOnly.FromDateTime(DateTime.Now);
if (now.IsBetween(t9,t17)) {
Console.WriteLine("Während der regulären Arbeitszeit!");
}
else {
Console.WriteLine("Außerhalb der regulären Arbeitszeit!");
}

Ancak, Microsoft’un bu yeni veri türlerini çeşitli .NET kitaplıklarında uygulamak için yapacak işleri vardır.

OR-Mapper Entity Framework Core’da, veri türleri şu ana kadar (.NET 6 RC1’den beri) yalnızca SQLite sağlayıcısında desteklenmiştir, ancak Microsoft SQL Server sağlayıcısında desteklenmemiştir, çünkü SQL Server için ADO.NET çekirdek sürücüsü ( System.Data.SqlClient) henüz yapamıyor.

JSON seri hale getirici System.Text.Json (kısaltılmış: STJ) ayrıca iki türü seri hale getirmek istemez: Serialization and deserialization of 'System.DateOnly' instances are not supported and should be avoided since they can lead to security issues. sırasıyla Serialization and deserialization of 'System.TimeOnly' instances are not supported and should be avoided since they can lead to security issues. Bunun için tartışma bulabilirsiniz GitHub im Issue #53539.


()



Haberin Sonu
 
Üst