Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么是;过渡期内的源时间。”;TZ4NET.NET时区库中的异常平均值_C#_Timezone_Tz4net - Fatal编程技术网

C# 什么是;过渡期内的源时间。”;TZ4NET.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.")

我正在使用来自的TZ4Net库 为了在ASP.NET中使用准确的时区

我最近开始得到“过渡期的源时间”

从代码的这一部分

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)?”

    • 有时你会想为他们挑选。根据您的需求,您可以选择第一次出现或第二次出现

TZ4Net是一个伟大的图书馆,作者(Zbigniew Babiej)多年来一直很友好地维护着它。但它最初是在.NET2.0时代编写的,因此它不处理
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;
    }
    
术语“向前跳”和“向后退”指的是夏令时的变化。您可以在中阅读更多内容

在“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)?”

    • 有时候你会的