Poner una cadena de fecha en una determinada zona horaria (compatible con el horario de verano)

Ok, he estado trabajando muy duro las últimas semanas y me he encontrado con un pequeño problema. No creo que mi mente esté lista para la tarea en este momento :) ¡así que necesito algunos consejos / ayuda! Es probable que sea muy simple, pero mi cabeza todavía no está haciendo clic.

os usuarios ingresarán una fecha y hora en AEST. También hay una zona horaria "predeterminada" configurada por la aplicación (ya que podría necesitar cambiar), actualmente está configurada en "Hora estándar del este de AUS"

Así que tenemos una cadena de usuario sin zona horaria y una zona horaria del sistema definida en un servidor en los EE. UU. (Por lo tanto, el local no coincide y no se puede cambiar ni usar)

Ahora lo que necesito es una forma de decir "analizar esta cadena ingresada por el usuario usando la zona horaria X". No puedo simplemente ingresar +10 o +11 como compensación, ya que las fechas podrían estar dentro o fuera del horario de verano; ¡lo cual sí lo cambia entre +10 y +11 incluso para la misma zona horaria!

La hora actual de AEST también puede estar dentro o fuera del horario de verano, por lo que no puedo convertir una fecha UTC a la hora actual de AEST y obtener la cadena "zzz" y adjuntarla ya que las fechas estarán apagadas por una hora para cualquier cosa ingresada fuera de la configuración actual de horario de verano.

Por ahora, el código en realidad hace exactamente eso:

TimeZoneInfo ConvTo = TimeZoneInfo.FindSystemTimeZoneById(ConfigurationManager.AppSettings["DefaultTimeZone"]);
DateTimeOffset getDate = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, ConvTo);
string TimeZoneId = " " + getDate.ToString("zzz");
DateTimeOffset cvStartDate = DateTimeOffset.MinValue; DateTimeOffset.TryParse(StartDate + TimeZoneId, out cvStartDate);

Luego verifico si la fecha no es válida comprobando si todavía == DateTimeOffset.MinValue o la convierto a UTC y la agrego a la base de datos, se volverá a convertir a AEST cuando se muestre. Sin embargo, algunas fechas están apagadas por una hora y otras son perfectas (como se esperaba):

Cuál es la forma más elegante de resolver esto?

EDITAR

Para ayudar a explicar el problema, escribí un código de prueba como una aplicación de prueba de Windows:

// User entered date
string EnteredDate = "2011/01/01 10:00:00 AM";

// Get the timezone we want to use
TimeZoneInfo myTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");

// Find the timezone string of the selected timezone to parse the user string
// This is the part that is incorrect and what i need help with.
DateTimeOffset getDate = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, myTimeZone);
string TimeZoneId = " " + getDate.ToString("zzz");

// Parse the string into the date object
DateTimeOffset cvEnteredDate = DateTimeOffset.MinValue; DateTimeOffset.TryParse(EnteredDate + TimeZoneId, out cvEnteredDate);

// Display
textBox1.Text += "Parsed: " + cvEnteredDate.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine;

// Convert to UTC and display
cvEnteredDate = cvEnteredDate.ToUniversalTime();
textBox1.Text += "UTC: " + cvEnteredDate.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine;

// Convert back to AEST and display
cvEnteredDate = TimeZoneInfo.ConvertTime(cvEnteredDate, myTimeZone);
textBox1.Text += "Changed Back: " + cvEnteredDate.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine;

¿Cuál es el resultado de esto?

Parsed: 2011/01/01 10:00:00 +10:00
UTC: 2011/01/01 00:00:00 +00:00
Changed Back: 2011/01/01 11:00:00 +11:00

Tenga en cuenta que la hora es libre en una y el desplazamiento es diferente. Además, ¿qué pasa si SOLO cambiamos la fecha ingresada a:

string EnteredDate = "2011/04/20 10:00:00 AM";

obtenemos

Parsed: 2011/04/20 10:00:00 +10:00
UTC: 2011/04/20 00:00:00 +00:00
Changed Back: 2011/04/20 10:00:00 +10:00

Lo cual es perfectamente bueno y está bien, usando el mismo código solo una fecha ingresada diferente.

Esto sucede porque la configuración de DST actual y la configuración de DST de la fecha ingresada son diferentes, esto es para lo que quiero una solución:)

Piénsalo como el problema del huevo y la gallina. Necesito los datos de zona horaria correctos para la cadena ingresada antes de analizarla, que solo puedo obtener después de haber analizado la cadena (por lo que será una solución elaborada)

O necesito .NET para analizar la cadena usando el objeto myTimeZone para que sepa qué configurarlo en sí mismo, pero no puedo ver ninguna función que haga esto, ellostodo tome un objeto ya analizado y establezca datetime o datetimeoffset objeto

¿Entonces estoy buscando soluciones elegantes que otros podrían haber hecho? ¿Ciertamente no puedo ser el único que se ha dado cuenta de esto?

EDIT2:

Ok, he creado una función de 'trabajo' que resuelve el problema, creo, aquí hay un ejemplo (agregue un cuadro de texto a una aplicación de Windows C # y use el siguiente código para probarse a sí mismo):

private void Form1_Load(object sender, EventArgs e)
{
    TimeZoneInfo myTimeZone = TimeZoneInfo.FindSystemTimeZoneById("AUS Eastern Standard Time");

    DateTimeOffset get1Date = ReadStringWithTimeZone("2011/01/01 10:00:00 AM", myTimeZone);
    textBox1.Text += "Read1: " + get1Date.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine;
    get1Date = get1Date.ToUniversalTime();
    textBox1.Text += "Read1 - UTC: " + get1Date.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine;
    get1Date = TimeZoneInfo.ConvertTime(get1Date, myTimeZone);
    textBox1.Text += "Changed Back: " + get1Date.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine + Environment.NewLine;

    DateTimeOffset get2Date = ReadStringWithTimeZone("2011/04/20 10:00:00 AM", myTimeZone);
    textBox1.Text += "Read2: " + get2Date.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine;
    get2Date = get2Date.ToUniversalTime();
    textBox1.Text += "Read2 - UTC: " + get2Date.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine;
    get2Date = TimeZoneInfo.ConvertTime(get2Date, myTimeZone);
    textBox1.Text += "Changed Back: " + get2Date.ToString("yyyy/MM/dd HH:mm:ss zzz") + Environment.NewLine + Environment.NewLine;
}

public DateTimeOffset ReadStringWithTimeZone(string EnteredDate, TimeZoneInfo tzi)
{
    DateTimeOffset cvUTCToTZI = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tzi);
    DateTimeOffset cvParsedDate = DateTimeOffset.MinValue; DateTimeOffset.TryParse(EnteredDate + " " + cvUTCToTZI.ToString("zzz"), out cvParsedDate);
    if (tzi.SupportsDaylightSavingTime)
    {
        TimeSpan getDiff = tzi.GetUtcOffset(cvParsedDate);
        string MakeFinalOffset = (getDiff.Hours < 0 ? "-" : "+") + (getDiff.Hours > 9 ? "" : "0") + getDiff.Hours + ":" + (getDiff.Minutes > 9 ? "" : "0") + getDiff.Minutes;
        textBox1.Text += "Diff: " + MakeFinalOffset + Environment.NewLine;
        DateTimeOffset.TryParse(EnteredDate + " " + MakeFinalOffset, out cvParsedDate);
        return cvParsedDate;
    }
    else
    {
        return cvParsedDate;
    }
}

Y la salida:

Diff: +11:00
Read1: 2011/01/01 10:00:00 +11:00
Read1 - UTC: 2010/12/31 23:00:00 +00:00
Changed Back: 2011/01/01 10:00:00 +11:00

Diff: +10:00
Read2: 2011/04/20 10:00:00 +10:00
Read2 - UTC: 2011/04/20 00:00:00 +00:00
Changed Back: 2011/04/20 10:00:00 +10:00

Solo es posible que haya un problema si la fecha ingresada por el usuario es correcta en el cambio durante la hora del horario de verano, aún puede ser una hora libre ya que solo está leyendo el desplazamiento actual y usándolo, luego verificando si se supone que es horario de verano o no, y si está ahí fuera, se leería incorrectamente. Sin embargo, es mucho mejor que lo que tengo ahora.

¿Puede alguien ayudarme a limpiar esta función? ¿Es esta la mejor ruta para lo que necesito? ideas?

Respuestas a la pregunta(5)

Su respuesta a la pregunta