什么是 MapTimeZoneId 的 Noda Time 2.0 等价物?
What's the Noda Time 2.0 equivalent of MapTimeZoneId?
我使用以下代码已经有一段时间了:
internal static string WindowsToIana(string windowsZoneId)
{
if (windowsZoneId.Equals("UTC", StringComparison.Ordinal))
return "Etc/UTC";
var tzdbSource = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default;
var tzi = TimeZoneInfo.FindSystemTimeZoneById(windowsZoneId);
if (tzi == null) return null;
var tzid = tzdbSource.MapTimeZoneId(tzi);
if (tzid == null) return null;
return tzdbSource.CanonicalIdMap[tzid];
}
将 NodaTime 升级到 2.0 版时,我现在收到一个编译时错误,提示 MapTimeZoneId
不再存在。如何让这个功能再次运行?
目前,您需要 Noda Time 内部存在的相同代码,但不是很多:
internal static string WindowsToIana(string windowsZoneId)
{
// Avoid UTC being mapped to Etc/GMT, which is the mapping in CLDR
if (windowsZoneId == "UTC")
{
return "Etc/UTC";
}
var source = TzdbDateTimeZoneSource.Default;
string result;
// If there's no such mapping, result will be null.
source.WindowsMapping.PrimaryMapping.TryGetValue(windowsZoneId, out result);
// Canonicalize
if (result != null)
{
result = source.CanonicalIdMap[result];
}
return result;
}
备注:
- 此代码适用于无论出于何种原因不存在于您的系统中但存在于 CLDR
中的时区 ID
- 如果这是 全部 你正在用 Noda Time 做,考虑使用 TimeZoneConverter 而不是
- 如果您 运行 在非 Windows 系统上的 .NET Core 上,
TimeZoneInfo.Local.Id
可能已经是 IANA ID,因此此代码将 return null
在大多数情况下。
我已提交 an issue 以处理迁移指南中未提及的事实。
我使用以下代码已经有一段时间了:
internal static string WindowsToIana(string windowsZoneId)
{
if (windowsZoneId.Equals("UTC", StringComparison.Ordinal))
return "Etc/UTC";
var tzdbSource = NodaTime.TimeZones.TzdbDateTimeZoneSource.Default;
var tzi = TimeZoneInfo.FindSystemTimeZoneById(windowsZoneId);
if (tzi == null) return null;
var tzid = tzdbSource.MapTimeZoneId(tzi);
if (tzid == null) return null;
return tzdbSource.CanonicalIdMap[tzid];
}
将 NodaTime 升级到 2.0 版时,我现在收到一个编译时错误,提示 MapTimeZoneId
不再存在。如何让这个功能再次运行?
目前,您需要 Noda Time 内部存在的相同代码,但不是很多:
internal static string WindowsToIana(string windowsZoneId)
{
// Avoid UTC being mapped to Etc/GMT, which is the mapping in CLDR
if (windowsZoneId == "UTC")
{
return "Etc/UTC";
}
var source = TzdbDateTimeZoneSource.Default;
string result;
// If there's no such mapping, result will be null.
source.WindowsMapping.PrimaryMapping.TryGetValue(windowsZoneId, out result);
// Canonicalize
if (result != null)
{
result = source.CanonicalIdMap[result];
}
return result;
}
备注:
- 此代码适用于无论出于何种原因不存在于您的系统中但存在于 CLDR 中的时区 ID
- 如果这是 全部 你正在用 Noda Time 做,考虑使用 TimeZoneConverter 而不是
- 如果您 运行 在非 Windows 系统上的 .NET Core 上,
TimeZoneInfo.Local.Id
可能已经是 IANA ID,因此此代码将 returnnull
在大多数情况下。
我已提交 an issue 以处理迁移指南中未提及的事实。