پس از مدت ها انتظار، بالاخره دو نوع داده DateOnly و TimeOnly در دات نت ۶ پیش نمایش ۴ ارائه شد. برخلاف نوع داده DateTime که هم زمان و هم ساعت را در خود جای می دهد، این دو نوع داده جدید، زمان یا ساعت را به تنهایی مشخص می کنند. DateOnly و TimeOnly هر دو Struct هستند و value type به حساب می آیند.

پیش نیاز استفاده از DateOnly و TimeOnly در Net 6.

برای استفاده از DateOnly و TimeOnly در دات نت کافی است SDK دات نت ۶ پیش نمایش ۴ به بعد را از این لینک دانلود کنید. همچنین استفاده از Visual Studio Preview یا Visual Studio Code را پیشنهاد می کنم.

این دو نوع داده جدید، همانند DateTime در System Name Space قرار دارند. پس برای استفاده کافی است using System را در ابتدای کلاس خود قرار دهید.

کار با DateOnly در دات نت

برای نمونه سازی از DateOnly کافی است به شکل زیر عمل کنیم:

var date = new DateOnly();

سازنده DateOnly سه Over Load دارد که کد فوق اولین مورد آن است. انواع Over Load را در کد زیر می بینیم:

var firstDate = new DateOnly();

var today = new DateOnly(2021, 5, 26);

var calendar = new PersianCalendar();
var todayWithCalendar = new DateOnly(1400, 3, 4, calendar);


WriteLine(firstDate);            //  1/1/0001
WriteLine(today);                //  5/26/2021
WriteLine(todayWithCalendar);    //  5/25/2021

در آخرین Over Load می توانیم یک Calendar برای مثال PersianCalendar را برای تبدیل تاریخ استفاده کنیم. همچنین می توانیم از یک DateTime برای ایجاد DateOnly استفاده کنیم:

var dateOnlyFromDateTime = DateOnly.FromDateTime(DateTime.Now);

WriteLine(dateOnlyFromDateTime);    // 5/26/2021

یا حتی بر اساس تعداد روز:

var oldDay = DateOnly.FromDayNumber(5);

WriteLine(oldDay);    // 1/6/0001

همچنین می توانیم یک string را به DateOnly تبدیل کنیم:

if (DateOnly.TryParse("1400/03/05", new CultureInfo("fa-ir"), DateTimeStyles.None, out var result))
{
    WriteLine(result);    // 5/26/2021
}
else
{
    WriteLine("Oh no!");
}

می توانیم به DateOnly روز، ماه یا سال اضافه کنیم:

var today = DateOnly.FromDateTime(DateTime.Now);

var someDayInFuture = today.AddMonths(1).AddDays(1).AddYears(1);

WriteLine(today);              //  5/26/2021
WriteLine(someDayInFuture);    //  6/27/2022

نوع داده DateOnly نیز همانند DateTime شامل پراپرتی و متد هایی همچون Day ، Year ، CompareTo و … نیز هست. برای مثال:

var today = DateOnly.FromDateTime(DateTime.Now);

WriteLine(today.ToLongDateString());   // Wednesday, May 26, 2021

کار با TimeOnly در دات نت

سازنده TimeOnly پنج Over Load دارد که در کد زیر می بینیم. به متد های استفاده شده هنگام WriteLine توجه کنید:

var baseTime = new TimeOnly();
var myFavoriteMovie = new TimeOnly(hour: 18, minute: 20);
var timeWithSeconds = new TimeOnly(hour: 18, minute: 20, second: 25);
var timeWithMilliseconds = new TimeOnly(hour: 18, minute: 20, second: 25, millisecond: 350);
var timeBasedOnTocks = new TimeOnly(ticks: 95000000000);

WriteLine(baseTime.ToLongTimeString());           // 12:00:00 AM
WriteLine(myFavoriteMovie.ToShortTimeString());   // 6:20 PM
WriteLine(timeWithSeconds.ToTimeSpan());          // 18:20:25
WriteLine(timeWithMilliseconds.Ticks);            // 660253500000
WriteLine(timeBasedOnTocks);                      // 2:38 AM

احتمالا تمامی سازنده ها، بجز آخرین مورد نیازی به توضیح ندارند. TimeOnly از یک Long برای نگهداری تعداد tick ها استفاده می کند. هر tick برابر ۱۰۰ نانو ثانیه هست. اولین tick از ساعت ۱۲ صبح شروع می شود و تعداد tick ها مقدار نهایی DateTime را مشخص می کند. برای مثال در کد فوق متغیر timeBasedOnTocks بر اساس ۹۵۰۰۰۰۰۰۰۰۰ tick ایجاد شده است که ساعت ۲:۳۸ AM را نشان می دهد و همچنین در چهارمین WriteLine تعداد tick های مربوط به ساعت ۱۸:۲۰:۲۵:۳۵۰ نشان داده شده است.

از عملگر های + و – نیز می توانیم بین دو TimeOnly استفاده کنیم که حاصل استفاده آن TimeSpan خواهد بود. همچنین می توانیم بررسی کنیم یک ساعت در بین دو ساعت دیگر هست یا خیر:

var firstTime = new TimeOnly(15, 35);
var secondTime = new TimeOnly(20, 20);

var myTime = TimeOnly.FromDateTime(DateTime.Now);

WriteLine($"Result is : {myTime.IsBetween(firstTime, secondTime)}");

همانطور که در کد فوق دیدید همانند DateOnly ، می توان برای نمونه سازی از TimeOnly از DateTime نیز استفاده نمود.

امکان بررسی کوچکتر یا بزرگتر بودن نیز فراهم است:

var firstTime = new TimeOnly(15, 35);
var secondTime = new TimeOnly(20, 20);

WriteLine($"{(firstTime > secondTime ? "firstTime" : "secondTime")} is grater!!!");

همچنین همانند DateOnly متد هایی برای افزودن مقادیری به TimeOnly نیز وجود دارد. برای مثال متد AddHours یا AddMinutes .

تاثیر DateOnly و TimeOnly در Entity Framework Core

به صورت خلاصه TimeOnly در SQL Server به نوع داده time و DateOnly به نوع داده date مپ می شود. هنوز پشتیبانی از این دو نوع داده در EF Core وجود ندارد و این قسمت از پست در آینده بروزرسانی می شود.

 

منابع

تصویر پست : https://fuentitech.com/net-6-date-and-time-structure/11045

تغییرات دات نت ۶ پیش نمایش ۴ : https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-4