如何在C#中移除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

