我有一个DateTimeOffset结构体,我想将其转换为 或从 转换为DateOnly,但似乎没有直接转换选项。
因为DateTime有FromDateTime(DateTime dateTime)- 我没有看到任何东西DateTimeOffset。
如何在 DateTimeOffset 和 DateOnly 之间进行转换?
您只需使用即可.Date获取日期作为DateTime值,然后FromDateTime转换为DateOnly
DateOnly.FromDateTime(yourValue.Date)
Run Code Online (Sandbox Code Playgroud)
请注意,其结果是考虑偏移之前的日期。
这些现有的答案非常有帮助,并且绝对让我找到了正确的方向。他们缺少的是处理时区。您可能不关心您的所有日期是否始终与服务器位于同一区域。以下方法涵盖了该用例。
在这里使用代码: https: //dotnetfiddle.net/kFOTd3
public static class DateOnlyExtensions {
public static DateTimeOffset ToDateTimeOffset(this DateOnly dateOnly, TimeZoneInfo zone) {
var dateTime = dateOnly.ToDateTime(new TimeOnly(0));
return new DateTimeOffset(dateTime, zone.GetUtcOffset(dateTime));
}
public static DateOnly ToDateOnly(this DateTimeOffset dto, TimeZoneInfo zone) {
var inTargetZone = TimeZoneInfo.ConvertTime(dto, zone);
return DateOnly.FromDateTime(inTargetZone.Date);
}
}
Run Code Online (Sandbox Code Playgroud)
这些可以按如下方式使用:
public static void Main()
{
var now = DateTimeOffset.UtcNow;
var utc = TimeZoneInfo.Utc;
var hawaii = TimeZoneInfo.FindSystemTimeZoneById("Pacific/Honolulu");
var christmasIslands = TimeZoneInfo.FindSystemTimeZoneById("Pacific/Enderbury");
Console.WriteLine("DateTimeOffset to DateOnly:");
Console.WriteLine($"UTC Now: {now}");
Console.WriteLine($"Date in Hawaii: {now.ToDateOnly(hawaii)}");
Console.WriteLine($"Date In Christmas Islands: now.ToDateOnly(christmasIslands)}");
Console.WriteLine("====================\n");
Console.WriteLine("DateOnly to DateTimeOffset");
var totallyRandomDate = DateOnly.Parse("2020-03-11");
Console.WriteLine($"DateTimeOffset UTC: {totallyRandomDate.ToDateTimeOffset(utc)}");
Console.WriteLine($"DateTimeOffset Hawaii: {totallyRandomDate.ToDateTimeOffset(hawaii)}");
Console.WriteLine($"DateTimeOffset Christmas Islands: {totallyRandomDate.ToDateTimeOffset(christmasIslands)}");
}
Run Code Online (Sandbox Code Playgroud)
你可以只使用构造函数:
DateOnly do1 = new (2022,03,14);
DateTimeOffset dto1 = new(do1.Year, do1.Month, do1.Day, 0, 0, 0, TimeSpan.FromHours(10));
Run Code Online (Sandbox Code Playgroud)
和
DateTimeOffset dto2 = new(2022,03,14,23,40,11, TimeSpan.FromHours(10));
DateOnly do2 = new (dto2.Year, dto2.Month, dto2.Day);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9561 次 |
| 最近记录: |