You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中移除DateTime时区信息保留本地时间(不使用字符串解析)

如何在.NET Core中移除DateTime的时区信息(不使用字符串解析)?

我有相关需求,但不想使用任何基于字符串的解析方法。

我有来自全球各地的事件,它们的时间戳是通过DateTime.Now收集的。我希望按事件对应的本地创建时间(而非UTC时间)进行上报。

给定格式如下的日期时间:
2024-05-08T17:31:53.9744487+03:00

我希望提取出2024-05-08T17:31:53.9744487作为DateTime类型,以此来上报事件的本地时间。我不想使用字符串解析(或任何字符串操作),因为这类方法容易出错。

以下是我期望通过的测试用例:

[Fact]
public void DateTimeConversionTest()
{
    // Arrange
    var testDateTime = DateTime.Parse("2024-05-08T17:31:53.9744487+03:00");
    var expectedTimeString = "17:31:53";

    // Act
    var convertedDateTime = testDateTime; // convert DateTime to local DateTime here
    var convertedTimeString = convertedDateTime.ToString("HH:mm:ss");

    // Assert
    Assert.Equal(expectedTimeString, convertedTimeString);
}

在C#中解决这个问题似乎出乎意料地困难,我在网上找不到可行的方案。有人知道如何解决吗?


编辑1:经过他人解释,我意识到原问题存在错误——从字符串解析得到的DateTime会立即丢失时区偏移信息。因此正确的解决方案应该改用DateTimeOffset类型。

编辑2:对于其他在使用System.Text.Json反序列化时遇到类似问题的开发者:如果接收的是2024-05-08T17:31:53.9744487+03:00格式的时间字符串,且希望移除时区信息,可将接收对象的属性类型从DateTime改为DateTimeOffset。

修改后,System.Text.Json会将其正确反序列化为DateTimeOffset,之后即可通过DateTimeOffset.DateTime获取不含时区信息的DateTime实例。

示例如下:

原类定义:

public class MyEvent
{
    public string FullName { get; set; }
    public DateTime Created { get; set; }
    public DateTime CreatedUtc { get; set; }
}

修改后的类定义:

public class MyEvent
{
    public string FullName { get; set; }
    public DateTimeOffset Created { get; set; }
    public DateTime CreatedUtc { get; set; }
}

此时执行以下反序列化代码即可正常工作:
var myEvent = JsonSerializer.Deserialize<MyEvent>(json)

通过myEvent.Created.DateTime即可获取不含时区信息的DateTime。


内容的提问来源于stack exchange,提问作者Tanuki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 14:18:34