假设时区时将字符串解析为 DateTimeOffset

Iza*_*cch 3 c# timezone datetime datetimeoffset

可能是一个超级简单的解决方案,但我显然错过了一些东西。

我有一个值为“2020/07/29 13:30:00”的字符串对象。

我如何将其解析为 DateTimeOffset 对象,并假设该解析时间的时区是“GMT 标准时间”,或者是我希望指定的任何 TimeZoneInfo?

然后,我如何获取该 DateTimeOffset,并返回其 Utc 时间,但返回到我选择的任何指定时区?

非常感谢

can*_*on7 6

我能找到的最简单的就是这样的。

我找不到任何方法来解析DateTimeOffset特定给定时区中的 a ,但是您可以将字符串解析为 a DateTime( 使用 a Kindof Unspecified,它只是充当字符串中信息位的容器,而无需尝试应用时区知识到它)。

然后,您可以询问TimeZoneInfoUTC定当地时间在给定时区的偏移量,并将其应用于DateTime创建一个DateTimeOffset.

一旦您获得了DateTimeOffset,您就可以使用它的ToOffset方法和 来使用它TimeZoneInfo.ConvertTime

string input = "2020/07/29 13:30:00";
var timezone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");

// DateTime.Parse creates a DateTime with Kind == Unspecified
var dateTime = DateTime.Parse(input);
Console.WriteLine(dateTime); // 7/29/2020 1:30:00 PM

// Since Kind == Unspecified, timezone.GetUtcOffset will give us the UTC offset in effect at
// the given local time in timezone
var dateTimeOffset = new DateTimeOffset(dateTime, timezone.GetUtcOffset(dateTime));
Console.WriteLine(dateTimeOffset); // 7/29/2020 1:30:00 PM +01:00

// Convert to UTC
Console.WriteLine(dateTimeOffset.UtcDateTime); // 7/29/2020 12:30:00 PM
Console.WriteLine(dateTimeOffset.ToOffset(TimeSpan.Zero)); // 7/29/2020 12:30:00 PM +00:00

// Convert to another timezone
var cst = TimeZoneInfo.FindSystemTimeZoneById("Central America Standard Time");
Console.WriteLine(TimeZoneInfo.ConvertTime(dateTimeOffset, cst)); // 7/29/2020 6:30:00 AM -06:00
Run Code Online (Sandbox Code Playgroud)