应用偏移时表示的UTC时间必须介于0到10,000之间。参数名称:offset

时间:2012-12-10 10:36:36

标签: asp.net-mvc exception datetimeoffset

我在ASP.NET MVC3控制器中有以下代码:

public PartialViewResult GetCalendar(int? month, int? year)
    {
        var test = new DateTime((year.HasValue ? year.Value : 1), (month.HasValue ? month.Value : 1), 1);
        return PartialView("Calendar", new DateTimeOffset(test));
    }

我的观看模型是DateTimeOffset?

抛出异常的原因是什么?

4 个答案:

答案 0 :(得分:33)

DateTimeOffset构造函数首先将任何非DateTime'UTC'的Kind转换为等效的UTC时间。然后它将检查UTC等效DateTime是否超出DateTimeOffset.MinValueDateTimeOffset.MaxValue的范围,如果是,则会抛出ArgumentOutOfRangeException类似于你的DateTime.Kind正在经历。

检查您正在使用的变量test的{​​{1}},如果它不是'UTC',请确定转换为UTC是否会使DateTime指定为test {1}}超出这些范围 - 根据MSDN文档,MinValueMaxValue(UTC)是'1/1/0001 12:00:00 AM +00:00'和'12 / 31/9999 11:59:59 PM +00:00'。

文档(DateTimeOffset.MinValue)注意到:

“在方法与MinValue进行比较之前,任何DateTimeOffset值都会转换为协调世界时(UTC)。这意味着日期和时间接近最小范围但偏移量为正的DateTimeOffset值可能会抛出例如,值1/1/0001 1:00:00 AM +02:00超出范围,因为它比MinValue提前一小时转换为UTC。“

还有(DateTimeOffset.MaxValue):

“在将方法与MaxValue进行比较之前,任何DateTimeOffset值都会转换为协调世界时(UTC)。这意味着DateTimeOffset值的日期和时间接近最大范围,但其偏移量为负,可能会抛出例如,值12/31/9999 11:00 PM -02:00超出范围,因为它比MaxValue晚一个小时转换为UTC。“

根据文档(DateTimeOffset Constructor),应用于非UTC Kind的偏移量是“本地系统当前时区的偏移量”。

答案 1 :(得分:8)

我刚刚遇到这个问题,由我的团队介绍,这是一个负面的UTC区域......

Chamila_c发布的是发生这种情况的真正原因,但我需要快速修复。

要“解决”我基本上创建了这个扩展名:

public static class DateTimeExtensions
{
    public static DateTimeOffset ToDateTimeOffset(this DateTime dateTime)
    {
        return dateTime.ToUniversalTime() <= DateTimeOffset.MinValue.UtcDateTime
                   ? DateTimeOffset.MinValue 
                   : new DateTimeOffset(dateTime);
    }
}

您可能还想检查MaxValue。

答案 2 :(得分:1)

当您在 function.json 中设置计时器触发器计划以使其永远不会运行时,这可能会在 Azure Function 开发过程中发生,如下所示:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
        "name": "mytimer",
        "type": "timerTrigger",
        "direction": "in",
        "schedule": "0 0 0 31 2 *"
    }
  ]
}

... 我已将其设置为在 2 月 31 日运行(即从不。)显然“从不”超出了允许的日期范围。解决方案是不那么棘手,只需在遥远的未来设置一个真实的日期:

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
        "name": "mytimer",
        "type": "timerTrigger",
        "direction": "in",
        "schedule": "0 0 0 1 1 * "
    }
  ]
}

(1 月 1 日运行一次,直到明年才会运行。)

再次感谢 Camila Chulatunga 描述了问题的根源。

答案 3 :(得分:0)

如果要处理的数据类型是DateTime,则应创建一个指定Kind的DateTime对象。

DateTime maxDate = DateTime.SpecifyKind(DateTime.MaxValue, DateTimeKind.UTC);

当它转换为DateTimeOffset数据类型时,不会出现该错误。