C# 什么是;过渡期内的源时间。”;TZ4NET.NET时区库中的异常平均值
我正在使用来自的TZ4Net库 为了在ASP.NET中使用准确的时区 我最近开始得到“过渡期的源时间” 从代码的这一部分C# 什么是;过渡期内的源时间。”;TZ4NET.NET时区库中的异常平均值,c#,timezone,tz4net,C#,Timezone,Tz4net,我正在使用来自的TZ4Net库 为了在ASP.NET中使用准确的时区 我最近开始得到“过渡期的源时间” 从代码的这一部分 static DateTime Convert(DateTime srcTime, string srcName, string dstName) { if (OlsonTimeZone.LookupName(srcName) == null) { throw new ArgumentException("Unknown source timezone name.")
static DateTime Convert(DateTime srcTime, string srcName, string dstName)
{
if (OlsonTimeZone.LookupName(srcName) == null)
{
throw new ArgumentException("Unknown source timezone name.");
}
if (OlsonTimeZone.LookupName(dstName) == null)
{
throw new ArgumentException("Unknown destintation timezone name.");
}
OlsonTimeZone srcZone = OlsonTimeZone.GetInstance(srcName);
TimeCheckResult srcCheckRes = srcZone.CheckLocalTime(srcTime);
switch (srcCheckRes)
{
case TimeCheckResult.Valid :
{
OlsonTimeZone dstZone = OlsonTimeZone.GetInstance(dstName);
DateTime dstTime = dstZone.ToLocalTime(srcZone.ToUniversalTime(srcTime));
return dstTime;
}
case TimeCheckResult.InSpringForwardGap :
case TimeCheckResult.InFallBackRange :
{
throw new ArgumentException("Source time in transition period."); // THIS PART HERE
}
default :
{
throw new ArgumentException("Source time out of range.");
}
}
}
什么是TimeCheckResult.InFallBackRange?我应该如何处理此类错误
case TimeCheckResult.InSpringForwardGap :
case TimeCheckResult.InFallBackRange :
表示时钟在您试图计算的时间段内向前或向后移动。可能没有定义如何在不同的时间段处理此问题。一年只发生两次;)。处理它实际上取决于您计算时区差异的原因
表示时钟在您试图计算的时间段内向前或向后移动。可能没有定义如何在不同的时间段处理此问题。一年只发生两次;)。处理它实际上取决于您计算时区差异的原因。术语“向前跳”和“向后退”指的是夏令时的变化。您可以在中阅读更多内容
在“Spring-Forward”转换期间,存在本地时间中不存在的间隙值。例如,在美国,大多数时区在三月的第二个星期日从1:59:59跳到3:00:00。所以2:00:00的时间是无效的,因为它在间隙中
在“回退”转换期间,有一系列值在本地时间存在两次。例如,在美国,大多数时区在11月的第一个星期日从1:59:59回到1:00:00。因此,1:00:00的时间存在两次,因此对于它所指的两个时刻中的哪一个是不明确的
当您试图从处于过渡期的本地时间转换时,您应该执行以下操作:
- 对于一个处于“向前冲”过渡所造成的间隙中的时间来说,这根本不是一个有效的时间
- 您可能应该向用户显示一条错误消息,以便他们可以输入有效时间
- 或者,如果您想假设他们只是忘记了调整DST,您可能希望将时间提前一个小时(通常为1小时)。这通常用于每天重复发生的事件
- 对于一段由于处于“后退”过渡而模棱两可的时间,您需要确定您实际想要使用的两种可能性中的哪一种
- 在许多情况下,您应该向用户提示两个选项,以便他们做出决定。问问题:“你是指美国东部时间1:00(-0400)还是东部时间1:00(-0500)?”
- 有时你会想为他们挑选。根据您的需求,您可以选择第一次出现或第二次出现
DateTimeOffset
值。它也不考虑任何代码< >代码时间> /COD>值使用的<代码>。尽管.NET2.0中引入了DateTimeKind
,但它似乎从未被纳入TZ4Net。因此,必须非常小心地为其函数提供正确的值
如果你想继续使用奥尔森时区,你可以继续使用TZ4Net,但我也建议你试试。它是一个社区开发的开源项目(而不是一个作者),其主要开发人员是。对于DST转换,您也会有同样的担忧,但Noda Time的API将迫使您提前处理这些担忧,而不是在部署应用程序后才知道
如果您只想保留现有功能,可以按如下方式修改上述功能,以处理回退转换:
- 要假设第一个(日光)实例,请执行以下操作:
case TimeCheckResult.InFallBackRange: { OlsonTimeZone dstZone = OlsonTimeZone.GetInstance(dstName); DateTime dstTime = dstZone.ToLocalTime(srcZone.ToUniversalTime(srcTime.AddHours(-1)).AddHours(1)); return dstTime; }
case TimeCheckResult.InFallBackRange: { OlsonTimeZone dstZone = OlsonTimeZone.GetInstance(dstName); DateTime dstTime = dstZone.ToLocalTime(srcZone.ToUniversalTime(srcTime.AddHours(1)).AddHours(-1)); return dstTime; }
- 假设第二个(标准)实例:
case TimeCheckResult.InFallBackRange: { OlsonTimeZone dstZone = OlsonTimeZone.GetInstance(dstName); DateTime dstTime = dstZone.ToLocalTime(srcZone.ToUniversalTime(srcTime.AddHours(-1)).AddHours(1)); return dstTime; }
case TimeCheckResult.InFallBackRange: { OlsonTimeZone dstZone = OlsonTimeZone.GetInstance(dstName); DateTime dstTime = dstZone.ToLocalTime(srcZone.ToUniversalTime(srcTime.AddHours(1)).AddHours(-1)); return dstTime; }
- 您可能应该保留以下内容:
case TimeCheckResult.InSpringForwardGap: throw new ArgumentException("Source time in transition period.");
- 但是,如果您想假设用户只是忘记提前他们的时钟,您可以这样做来提前转换:
case TimeCheckResult.InSpringForwardGap: { OlsonTimeZone dstZone = OlsonTimeZone.GetInstance(dstName); DateTime dstTime = dstZone.ToLocalTime(srcZone.ToUniversalTime(srcTime.AddHours(1))); return dstTime; }
- 对于一个处于“向前冲”过渡所造成的间隙中的时间来说,这根本不是一个有效的时间
- 您可能应该向用户显示一条错误消息,以便他们可以输入有效时间
- 或者,如果您想假设他们只是忘记了调整DST,您可能希望将时间提前一个小时(通常为1小时)。这通常用于每天重复发生的事件
- 对于一段由于处于“后退”过渡而模棱两可的时间,您需要确定您实际想要使用的两种可能性中的哪一种
- 在许多情况下,您应该向用户提示两个选项,以便他们做出决定。问问题:“你是指美国东部时间1:00(-0400)还是东部时间1:00(-0500)?”
- 有时候你会的