我有一个 DateTimeOffset
结构体,想要将其转换为和从 DateOnly
转换,但似乎没有直接的转换选项。
对于 DateTime
,有 FromDateTime(DateTime dateTime)
- 但我没有看到适用于 DateTimeOffset
的任何内容。
如何转换为和从 DateTimeOffset 和 DateOnly?
我有一个 DateTimeOffset
结构体,想要将其转换为和从 DateOnly
转换,但似乎没有直接的转换选项。
对于 DateTime
,有 FromDateTime(DateTime dateTime)
- 但我没有看到适用于 DateTimeOffset
的任何内容。
如何转换为和从 DateTimeOffset 和 DateOnly?
您可以直接使用.Date
获取日期作为DateTime
值,并使用FromDateTime
转换为DateOnly
DateOnly.FromDateTime(yourValue.Date)
DateTimeOffset
而不是 DateTime 的。 - Chris Pfohl这些现有的答案非常有帮助,肯定让我朝着正确的方向寻找。它们缺少的是处理时区。如果您所有的日期始终与服务器在同一时区,那么您可能不需要关心。以下方法涵盖了该用例。
在此处尝试代码: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);
}
}
这些可以按如下方式使用:
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)}");
}
DateOnly do1 = new (2022,03,14);
DateTimeOffset dto1 = new(do1.Year, do1.Month, do1.Day, 0, 0, 0, TimeSpan.FromHours(10));
并且
DateTimeOffset dto2 = new(2022,03,14,23,40,11, TimeSpan.FromHours(10));
DateOnly do2 = new (dto2.Year, dto2.Month, dto2.Day);