c# - zona - utc gmt
Cómo analizar la zona horaria con fecha y hora en un parámetro de fecha y hora (2)
Estoy usando sabre jabón API para la reservación de vuelos.
Tengo un objeto DateTime
que requiere un parámetro con la zona horaria. La entrada debe ser como "2016-03-01T10:00:00-06:00"
En este momento estoy obteniendo el valor como
DateTime dt = DateTime.UtcNow;
string date = dt.ToString();
string tstamp = dt.ToString("mm-dd-yyyyTHH:mm:sszzz");
DateTimeOffset tstamp = DateTimeOffset.Parse(date);
DateTime datetime = tstamp.DateTime;
pero cuando lo vuelvo a convertir en DateTime
la zona horaria se elimina automáticamente. No puedo convertir el objeto a DateTimeoffset
porque la API lo requiere en el formato DateTime
.
Creo que esto podría ayudarlo, es posible obtener la fecha y hora que desea u obtener el desplazamiento como TimeSpan y luego agregarlo a su fecha y hora o guardarlo.
Editar: ahora veo que tal vez solo necesite obtener la cadena de un objeto DateTimeOffset, no de un objeto DateTime.
DateTime dt = DateTime.UtcNow;
string date = dt.ToString();
string tstampString = dt.ToString("MM-dd-yyyyTHH:mm:ssZZZ");
DateTimeOffset tstampDT = DateTimeOffset.Parse(date);
DateTime datetimeCurrent = tstampDT.DateTime;
DateTime datetimeUTC = tstampDT.UtcDateTime;
DateTime datetimeLocal = tstampDT.LocalDateTime;
TimeSpan offsetFromUTC = tstampDT.Offset;
editar:
string tstampOffsetString = tstampDT.ToString("MM-dd-yyyyTHH:mm:sszzz");
Intento explicar algunas cosas;
Tengo un objeto DateTime que requiere un parámetro con la zona horaria.
No, tu no .
Un DateTime
no tiene ningún formato implícito. Solo tiene valores de fecha y hora. El concepto "Formato" solo se aplica cuando obtienes su representación textual (también conocida como string
). Por lo tanto, es posible que tenga una cadena que tenga una parte compensada pero no una FechaHora.
pero cuando lo convierto de nuevo en DateTime, la zona horaria se elimina automáticamente.
Y un DateTime
sí mismo no contiene información de zona horaria real . Puede saber si es UTC
o Local
, pero no lo que realmente significa local. Además DateTimeOffset
tampoco tiene información de zona horaria. Simplemente tiene un Offset DateTime
y UTC . Pero esas informaciones no son suficientes para determinar una zona horaria ya que diferentes zonas horarias pueden tener el mismo desplazamiento.
Pero si realmente quieres generar la entrada "2016-03-01T10:00:00-06:00"
, puedo brindarte 2 formas que incluso yo no sugiero;
Genere una instancia DateTime
relacionada basada en ese valor, configure la zona horaria del sistema que tiene 6
horas de retraso como parte offfset (ya que no se recomienda usar el formato zzz
para DateTime que no se relaciona con la propiedad Kind
) y formatee su DateTime
;
DateTime dt = new DateTime(2016, 3, 1, 10, 0, 0);
Console.WriteLine(dt.ToString("yyyy-MM-ddTHH:mm:sszzz"));
// 2016-03-01T10:00:00-06:00
Genere la instancia DateTimeOffset
basada en esa parte DateTime y offset, después de formatearla como;
var dto = new DateTimeOffset(dt, TimeSpan.FromHours(-6));
Console.WriteLine(dto.ToString("yyyy-MM-ddTHH:mm:sszzz"));
// 2016-03-01T10:00:00-06:00