可能是一个超级简单的解决方案,但我显然缺少了一些东西。
我有一个字符串对象,其值是“ 2020/07/29 13:30:00”。
如何将其解析为DateTimeOffset对象,并假设该解析时间的时区为“ GMT标准时间”,或者我希望指定的任何TimeZoneInfo?
然后我该如何获取该DateTimeOffset,并将其Utc时间返回到我选择的任何指定时区?
非常感谢
可能是一个超级简单的解决方案,但我显然缺少了一些东西。
我有一个字符串对象,其值是“ 2020/07/29 13:30:00”。
如何将其解析为DateTimeOffset对象,并假设该解析时间的时区为“ GMT标准时间”,或者我希望指定的任何TimeZoneInfo?
然后我该如何获取该DateTimeOffset,并将其Utc时间返回到我选择的任何指定时区?
非常感谢
我最容易找到的是这样的东西。
我找不到在特定时区中解析DateTimeOffset
的任何方法,但是您可以将字符串解析为DateTime
(其中{{1}的Kind
},只是充当字符串中信息位的容器,而不会尝试将时区知识应用到其中。
然后,您可以向Unspecified
询问给定时区在给定的本地时间的TimeZoneInfo
偏移量,并将其应用于UTC
以创建DateTime
。
一旦有了DateTimeOffset
,就可以使用其DateTimeOffset
方法和ToOffset
使用它。
TimeZoneInfo.ConvertTime
,
尝试接受DateTimeOffset.ParseExact参数的DateTimeStyles重载。
此代码:
var dt=DateTimeOffset.ParseExact("2020/07/29 13:30:00","yyyy/MM/dd HH:mm:ss",CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal);
返回2020-07-29T13:30:00.0000000+00:00
没有GMT Standard Time
,这是Windows中使用的一个非常不幸的名称,它以某种方式设法将英国时间和UTC时间混合在一起,以至于没有人不看文档就不知道这意味着什么。在以下问题中对此进行了充分的讨论和解释:Difference between UTC and GMT Standard Time in .NET。正如答案之一所述:
在Redmond之外不知道GMT标准时间和GMT日光时间的名称。它们是只有在Windows注册表中出现的神话动物。
如果您想假设英国时间,并且您的计算机使用英国时区,则可以使用DateTimeStyles.AssumeLocal
此函数应将您的日期时间字符串(假设这是格林尼治标准时间)转换为任何其他时区:
public static DateTime? ToUTCTimeZone(string sDate,string timeZone)
{
DateTime utcDate = DateTime.Parse(sDate);
DateTimeOffset localServerTime = DateTimeOffset.Now;
utcDate = DateTime.SpecifyKind(utcDate,DateTimeKind.Utc);
TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById(timeZone);
if (cstZone == null)
return null;
return TimeZoneInfo.ConvertTimeFromUtc(utcDate,cstZone);
}//ToUTCTimeZone