我有一个与这个类似的问题:How to strip timezone from DateTime in .NET Core,但我不想使用任何基于字符串的解析.

基本上,我有来自世界各地的活动,它们的时间戳用DateTime.Now个收集

我想报告带有相应的本地创建时间戳(不是utc)的事件.

So given that each datetime is basically represented like this:
2024-05-08T17:31:53.9744487+03:00

我只想提取2024-05-08T17:31:53.9744487作为Date Time,以便我可以报告事件的当地时间.

我不想像上面的答案中那样进行任何字符串解析(或任何字符串操作),因为这些很容易出现错误.

这是我想通过的一个测试 case :

[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#解决起来非常困难的问题,因为我找不到任何在线工作的东西.

有人知道如何解决吗?

编辑:经过Derrick和Guru下面的解释,我意识到这个问题不正确,因为从字符串解析的日期立即失go 了时区偏差.因此解决方案是使用DateTimeOffset

推荐答案

如果我理解正确的话-您可以将DateTimeOffsetDateTimeOffset.DateTime个属性一起使用:

DateTime属性不受Offset属性值的影响.

var parsed = DateTimeOffset.Parse("2024-05-08T17:31:53.9744487+01:00");
var originalLocalDateTime = parsed.DateTime; // DateTimeKind.Unspecified

Csharp相关问答推荐

如何修改扩展方法以在C#中的DataTable转换中包括/排除特定列?

System.文本.Json现在总是需要无参数构造函数吗?

当MD5被废弃时,如何在Blazor WASM中使用它?

错误401未授权ASP.NET Core.使用JWT创建身份验证/授权

. NET Core DB vs JSON模型设计

如何在Visual Studio代码中更改大括号模式{},用于C#语言

当通过Google的Gmail Api发送邮件时,签名会产生dkim = neutral(正文散列未验证)'

如何在NodaTime中为Instant添加一年?

C#.NET依赖项注入顺序澄清

Blazorise折线图仅绘制数据集的一部分

ASP.NET配置kestrel以使用Windows证书存储中的HTTPS

升级后发出SWITCH语句

在集成测试中可以在模拟InMemory数据库中设定数据种子

当我try 在与XAMP的MySQL服务器连接的ASP.NET核心应用程序中添加迁移时出现错误

ASP.NET MVC数据批注验证组复选框

在构造函数中传递C#函数以用作EventHandler委托的订阅服务器

毛伊岛.NET 8图片不再适合按钮

使用SQL Server 2022+时,我是否必须将代码从SqlConnection类对象中迁移出来?

在使用.NET EF Core DbContext属性之前,是否应使用null判断

嵌套Blazor组件内的验证