asp.net-mvc - ejemplo - datetimeoffset to datetime sql
La hora UTC representada cuando se aplica el desplazamiento debe estar entre el año 0 y 10,000. Nombre del parámetro: offset (2)
Tengo el siguiente código en un controlador MVC3 de ASP.NET:
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));
}
Mi modelo de vista es DateTimeOffset?
¿Cuál es el motivo de la excepción lanzada?
Acabo de tener este problema, presentado por la parte de mi equipo que está en una zona UTC negativa ...
Lo que publicó chamila_c es la verdadera razón por la que esto sucede, pero necesitaba una solución rápida.
Para "resolverlo" básicamente creé esta extensión:
public static class DateTimeExtensions
{
public static DateTimeOffset ToDateTimeOffset(this DateTime dateTime)
{
return dateTime.ToUniversalTime() <= DateTimeOffset.MinValue.UtcDateTime
? DateTimeOffset.MinValue
: new DateTimeOffset(dateTime);
}
}
También es posible que desee comprobar contra el MaxValue.
El constructor DateTimeOffset
primero convierte cualquier DateTime
que no sea de Kind
''UTC'' a la hora UTC equivalente. Luego verificará si el DateTime
equivalente a UTC se encuentra fuera de los límites de DateTimeOffset.MinValue
y DateTimeOffset.MaxValue
, y si lo hace, lanzará una ArgumentOutOfRangeException
similar a la que está experimentando.
Verifique el DateTime.Kind
de la test
variables que está utilizando, y si no es ''UTC'', calcule si una conversión a UTC hará que el DateTime
especificado por la test
caiga fuera de esos límites, de acuerdo con la documentación de MSDN. MinValue
y MaxValue
(en UTC) son ''1/1/0001 12:00:00 AM +00: 00'' y ''12 / 31/9999 11:59:59 PM +00: 00 ''respectivamente.
Los documentos ( DateTimeOffset.MinValue ) tienen en cuenta que:
"Cualquier valor de DateTimeOffset se convierte a la hora universal coordinada (UTC) antes de que el método realice la comparación con MinValue. Esto significa que un valor de DateTimeOffset cuya fecha y hora están cerca del rango mínimo, pero cuyo desplazamiento es positivo, puede generar una excepción. Por ejemplo, el valor 1/1/0001 1:00:00 AM +02: 00 está fuera de rango porque es una hora antes que MinValue cuando se convierte a UTC ".
Y también ( DateTimeOffset.MaxValue ):
"Cualquier valor de DateTimeOffset se convierte a la hora universal coordinada (UTC) antes de que el método lo compare con MaxValue. Esto significa que un valor de DateTimeOffset cuya fecha y hora están cerca del rango máximo, pero cuyo desplazamiento es negativo, puede generar una excepción. Para por ejemplo, el valor 12/31/9999 11:00 PM -02: 00 está fuera de rango porque es una hora más tarde que MaxValue cuando se convierte a UTC ".
Y según los documentos ( DateTimeOffset Constructor ), el desplazamiento que se aplica a una Kind
no UTC es el "desplazamiento de la zona horaria actual del sistema local".