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

时间:2013-08-14 12:01:45

标签: c# .net datetime timezone portable-class-library

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

"8/14/2013 5:51am"

我希望将其转换为便携式类库中的UTC DateTime,并考虑夏令时。我发现Portable Class Library没有以下方法:

TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")

这可以在便携式类库中执行吗?如果没有,假如字符串中没有时区信息,我该如何在普通的类库中进行?

2 个答案:

答案 0 :(得分:4)

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

幸运的是,Noda Time具有可移植版本,但您需要使用IANA区域名称,而不是Windows区域名称。有关详细信息,请参阅timezone tag wiki。另外,请务必阅读limitations of NodaTime as a 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();

答案 1 :(得分:2)

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

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

  

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

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