使用可移植类库将东部标准时间字符串转换为UTC日期时间



我有一个字符串,我知道它是东部标准时间:

"8/14/2013 5:51am"

我想在我的可移植类库中将其转换为UTC日期时间,同时考虑夏令时。我发现可移植类库没有以下方法:

TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")

这可以在可移植类库中实现吗?如果没有,在字符串中没有时区信息的情况下,如何在普通类库中执行此操作?

TimeZoneInfo不是完全可移植的。它存在,但没有数据备份,因此只能提供对UTC和本地时区的访问。它无法通过id解析区域。

幸运的是,Noda Time有一个可移植的版本,但您需要使用IANA区域名称,而不是Windows区域名称。有关详细信息,请参阅时区标记wiki。此外,请确保您阅读了NodaTime作为PCL的限制。

using NodaTime;
using NodaTime.Text;
LocalDateTimePattern pattern = LocalDateTimePattern
                                 .CreateWithInvariantCulture("M/dd/yyyy h:mmtt");
LocalDateTime ldt = pattern.Parse("8/14/2013 5:51am").Value;
DateTimeZone tz = DateTimeZoneProviders.Tzdb["America/New_York"];
ZonedDateTime zdt = tz.AtLeniently(ldt);
Instant instant = zdt.ToInstant();
Debug.WriteLine(instant.ToString());  // 2013-08-14T09:51:00Z   (UTC)
// if you need it as a DateTime
DateTime utc = instant.ToDateTimeUtc();

PCL公开了TimeZoneInfo结构,但没有包含所需的函数,这意味着您可能必须自己编写时区转换代码。如果你总是将一个时区转换为另一个时区,这应该不会太糟糕,但如果你的源时区分布在世界各地,那将是一个挑战。

起初,我打算推荐Jon Skeet等人的《Noda Time》,但他们列出了一个重要的限制,也是你发现的相同限制:

为可移植类库提供的.NET API受到更大的限制而不是完整的桌面版本。目前,这提供的相对较少Noda Time面临的挑战,只有一个重要的例外:时区信息。当我们能够检测到本地时区的TZDB时等效于TimeZoneInfo.StandardName而不是其ID(正如我们正常情况下),我们不能通过ID获取任意时区,也不能我们要求提供特定时区的调整规则。

如果Noda Time做不到,那么我认为你只能手动计算它。

最新更新