我有一个字符串,我知道是东部标准时间:
"8/14/2013 5:51am"
我希望将其转换为便携式类库中的UTC DateTime,并考虑夏令时。我发现Portable Class Library没有以下方法:
TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time")
这可以在便携式类库中执行吗?如果没有,假如字符串中没有时区信息,我该如何在普通的类库中进行?
答案 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不能做,那么我认为你只能手动计算它。