如何在 DateTimeOffset 和 DateOnly 之间进行转换?

som*_*men 10 c# .net-6.0

我有一个DateTimeOffset结构体,我想将其转换为 或从 转换为DateOnly,但似乎没有直接转换选项。

因为DateTimeFromDateTime(DateTime dateTime)- 我没有看到任何东西DateTimeOffset

如何在 DateTimeOffset 和 DateOnly 之间进行转换?

Cha*_*ace 9

您只需使用即可.Date获取日期作为DateTime值,然后FromDateTime转换为DateOnly

DateOnly.FromDateTime(yourValue.Date)
Run Code Online (Sandbox Code Playgroud)

请注意,其结果是考虑偏移之前的日期。


Cri*_*ole 6

这些现有的答案非常有帮助,并且绝对让我找到了正确的方向。他们缺少的是处理时区。可能不关心您的所有日期是否始终与服务器位于同一区域。以下方法涵盖了该用例。

在这里使用代码: 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)


tym*_*tam 1

你可以只使用构造函数:

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)