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

9

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

对于 DateTime,有 FromDateTime(DateTime dateTime) - 但我没有看到适用于 DateTimeOffset 的任何内容。

如何转换为和从 DateTimeOffset 和 DateOnly?


对于从 DateOnly 转换到 DateTimeOffset,您可以使用 .ToDateTime 吗?然后您可以按照以下步骤转换为 DateTimeOffset:https://learn.microsoft.com/en-us/dotnet/standard/datetime/converting-between-datetime-and-offset - sr28
3个回答

7

您可以直接使用.Date获取日期作为DateTime值,并使用FromDateTime转换为DateOnly

DateOnly.FromDateTime(yourValue.Date)

请注意,这一结果是在考虑抵消之前的日期。

这个问题是关于 DateTimeOffset 而不是 DateTime 的。 - Chris Pfohl
1
我从未说过这是关于“DateTime”的。在“DateTimeOffset”上有一个“Date”属性,它返回一个仅包含日期的“DateTime”值。 - Charlieface
我真的不明白你的意思,请解释一下。当“yourValue”是“DateTimeOffset”时,上述代码运行正常,那么问题到底出在哪里? - Charlieface
我正在重新阅读这个问题,很抱歉你是对的,这确实回答了“转换为DateOnly”的问题,但并没有回答“转换为DateTimeOffset”的问题。 - Chris Pfohl
1
我添加了另一种答案,因为老实说,在考虑时区或偏移量之前,没有人应该执行任何操作。也许 DateTimeOffset => DateOnly 的转换是安全的,但是 DateOnly => Offset 的转换是不可能的,除非明确指定日期所属的时区。 - Chris Pfohl
显示剩余2条评论

5

这些现有的答案非常有帮助,肯定让我朝着正确的方向寻找。它们缺少的是处理时区。如果您所有的日期始终与服务器在同一时区,那么您可能不需要关心。以下方法涵盖了该用例。

在此处尝试代码: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)}");
}

0
你可以使用构造函数:
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接