2

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

"8/14/2013 5:51am"

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

TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")

这可以在可移植类库中完成吗?如果没有,鉴于字符串中没有时区信息,我该如何在普通类库中执行此操作?

4

2 回答 2

4

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();
于 2013-08-14T12:48:58.197 回答
2

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

起初我打算推荐 Jon Skeet 等。al., Noda Time,但他们列出了一个重大限制和您发现的相同限制:

为可移植类库提供的 .NET API 比完整桌面版本更受限制。目前,这为 Noda Time 提供了相对较少的挑战,但有一个明显的例外:TimeZoneInfo。虽然我们能够通过 TimeZoneInfo.StandardName 而不是它的 ID 来检测本地时区的 TZDB 等效项(就像我们通常会做的那样),但我们不能通过 ID 获取任意时区,也不能要求特定的调整规则时区。

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

于 2013-08-14T12:41:39.030 回答