我将DateTime表示为字符串(例如"2023-08-13T11:32:59") 但这DateTime的时区既不是世界协调时,也不是当地时区

我想要解析此字符串,然后将其转换为本地时区.

到目前为止,我所做的是将其转换为UTC,然后转换为当地时区. 我写的这段代码可以做这项工作,但看起来很麻烦,有没有更好的方法?

DateTime sourceDateTime = DateTime.Parse(date);
TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");

DateTime unspecified = DateTime.SpecifyKind(sourceDateTime, DateTimeKind.Unspecified);
DateTime utcDateTime = TimeZoneInfo.ConvertTimeToUtc(unspecified, sourceTimeZone);

DateTime result = TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, TimeZoneInfo.Local);

推荐答案

以下是几件事:

  • 您的sourceDateTimealready在解析后有Unspecified种,所以不需要再次指定.

  • 您不需要通过UTC-您可以使用TimeZoneInfo.ConvertTime方法直接从源时区转换到目标时区.

因此,简化后的版本为:

DateTime sourceDateTime = DateTime.Parse("2023-08-13T11:32:59");
TimeZoneInfo sourceTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");

DateTime result = TimeZoneInfo.ConvertTime(sourceDateTime, sourceTimeZone, TimeZoneInfo.Local);

确保您还了解ConvertTime如何处理在DST转换附近可能出现的不明确和无效的DateTime值.从the docs人起:

如果参数dateTime的值在源时区中是不明确的时间,则将其解释为标准时间.如果dateTime参数在源时区中是无效时间,此方法将引发ArgumentException.

如果这不是您想要的行为,那么可能需要实现额外的逻辑.

Csharp相关问答推荐

如何在C#中使用并行主义将数据表转换为动态对象

C#将参数传递给具有变化引用的变量

有没有一种方法可以防止在编译时在MicrosoftC或非单线程上下文中调用方法?

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

数组被内部函数租用时,如何将数组返回给ArrayPool?

TDLib与机器人共享电话号码

在发布表单时绑定包含附加(嵌套)列表的对象列表的正确语法是什么

MAUI查询参数单一字符串项将不起作用

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

.NET:从XPath定位原始XML文档中的 node

在Docker容器中运行API项目时,无法本地浏览到index.html

有没有更好的方法来在CosmosDB上插入非id?

在Windows Plesk上发布ASP.NET Core 7 Web API-错误:无法加载文件或程序集';Microsoft.Data.SqlClient';

将操作从编辑页重定向到带参数的索引页

Azure Functions v4中的Serilog控制台主题

MudBlazor Textfield已禁用,但其验证工作正常

岛屿和框架中的自定义控件库.Navigate-AccessViolationException

C#如何获取字符串中引号之间的文本?

如何在C#控制台应用程序中获取用户输入并将其作为订单项目进行处理?

ASP.NET核心8:app.UseStaticFiles()管道执行顺序