我在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?
抛出异常的原因是什么?
答案 0 :(得分:33)
DateTimeOffset
构造函数首先将任何非DateTime
'UTC'的Kind
转换为等效的UTC时间。然后它将检查UTC等效DateTime
是否超出DateTimeOffset.MinValue
和DateTimeOffset.MaxValue
的范围,如果是,则会抛出ArgumentOutOfRangeException
类似于你的DateTime.Kind
正在经历。
检查您正在使用的变量test
的{{1}},如果它不是'UTC',请确定转换为UTC是否会使DateTime
指定为test
{1}}超出这些范围 - 根据MSDN文档,MinValue
和MaxValue
(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。“
“在将方法与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数据类型时,不会出现该错误。