Estoy almacenando todas mis fechas en formato UTC en mi base de datos. Le pregunto al usuario por su zona horaria y quiero usar su zona horaria más lo que supongo que es la hora del servidor para averiguar el UTC para ellos.Tengo problemas para convertir mi DateTime a UTC
Una vez que tengo eso quiero hacer una búsqueda para ver qué rango hay en la base de datos usando su fecha UTC recién convertida.
pero siempre obtengo esta excepción.
System.ArgumentException was unhandled by user code
Message="The conversion could not be completed because the
supplied DateTime did not have the Kind property set correctly.
For example, when the Kind property is DateTimeKind.Local,
the source time zone must be TimeZoneInfo.Local.
Parameter name: sourceTimeZone"
No sé por qué me sale esto.
me trataron 2 maneras
TimeZoneInfo zone = TimeZoneInfo.FindSystemTimeZoneById(id);
// I also tried DateTime.UtcNow
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var utc = TimeZoneInfo.ConvertTimeToUtc(now , zone);
Esto fracasó así que cansado
DateTime now = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
var utc = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(now,
ZoneId, TimeZoneInfo.Utc.Id);
Esto también falló ambos con el mismo error. ¿Qué estoy haciendo mal?
¿Editaría esto?
DateTime localServerTime = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local);
TimeZoneInfo info = TimeZoneInfo.FindSystemTimeZoneById(id);
var usersTime = TimeZoneInfo.ConvertTime(localServerTime, info);
var utc = TimeZoneInfo.ConvertTimeToUtc(usersTime, userInfo);
Editar 2 @ Jon Skeet
Ya estaba pensando acerca de que yo no fuera siquiera necesidad de hacer todo esto. Las cosas del tiempo me confunden ahora, así que es por eso que la publicación puede no ser tan clara como debería ser. Nunca sé qué diablos está recibiendo DateTime.Now (Intenté cambiar mi zona horaria a otra zona horaria y seguía obteniendo mi hora local).
Esto es lo que quería que hiciera mi trabajo. El usuario llega al sitio agrega un poco de alerta y ahora se guarda como utc (antes de que fuera DateTime.Now y luego alguien sugirió almacenar todo UTC).
Así que antes de que un usuario entrara a mi sitio y dependiendo de dónde estaba mi servidor de alojamiento podría ser al día siguiente. Entonces, si se dijo que la alerta se mostraría el 30 de agosto (su hora), pero con la diferencia horaria del servidor, podrían aparecer el 29 de agosto y se mostraría la alerta.
Así que quise combatir eso. Entonces, ¿no estoy seguro de si solo debo almacenar su hora local y luego usar estas cosas de compensación? O simplemente almacene la hora UTC. Con solo almacenar el tiempo UTC podría ser incorrecto ya que el usuario aún estaría pensando en la hora local y no estoy seguro de cómo realmente funciona el UTC, pero podría terminar una diferencia de tiempo.
Edit3
var info = TimeZoneInfo.FindSystemTimeZoneById(id)
DateTimeOffset usersTime = TimeZoneInfo.ConvertTime(DataBaseUTCDate,
TimeZoneInfo.Utc, info);
'DateTime.Now.Kind' ya es' Local'; no necesita llamar 'SpecifyKind' en él. – SLaks
@Edit 2: Almacene las alertas en UTC y muéstrelas en la zona horaria proporcionada por el usuario como se muestra en mi respuesta. – dtb
Entonces, ¿cómo funcionaría eso? Obtengo el DateTime.UtcNow y filtro las alertas del db? luego convierte los resultados encontrados a su hora local? – chobo2