es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C# DateTime analiza incorrectamente dos cadenas de fecha separadas por milisegundos y devuelve un tiempo Unix negativo.

Estoy tratando de convertir cadenas de fecha a tiempo Unix utilizando dotnet 6 y durante mis pruebas, encontré un resultado extraño entre dos marcas de tiempo que difieren en milisegundos. Mi código de conversión es el siguiente (las partes comentadas son las variaciones que he probado y los resultados son los mismos):

static long convert<em>to</em>unix_time(DateTime date){ 
    return new DateTimeOffset(date, TimeSpan.Zero).ToUnixTimeMilliseconds();
}

static DateTime convert<em>to</em>timestamp(string date, string format) {
    string[] param = new string<1>;
    param[0] = format;

    var final = new DateTime();
    var parsed_time = DateTime.TryParseExact(
        date,
        param,
        CultureInfo.GetCultureInfo("en-ZA"), //CultureInfo.CurrentCulture, //CultureInfo.Invariant, 
        DateTimeStyles.None,
        out final);
    return final;
}

Al ejecutar esto:

var date1 = "20201214 13:00:04.156";
var date2 = "20201214 12:59:59.999";
string format = "yyyyMMdd hh:mm:ss.fff";

var final1 = convert<em>to</em>timestamp(date1, format);
var unix<em>time1 = convert</em>to<em>unix</em>time(final1);

Console.WriteLine("final1 es: {0}", final1.ToString(format));
Console.WriteLine("unix time1 es: {0}", unix_time1);

var final2 = convert<em>to</em>timestamp(date2, format);
var unix<em>time2 = convert</em>to<em>unix</em>time(final2);

Console.WriteLine("final2 es: {0}", final2.ToString(format));
Console.WriteLine("unix time2 es: {0}", unix_time2);

El resultado que obtengo es:

final1 es: 00010101 12:00:00.000
unix time1 es: -62135596800000
final2 es: 20201214 12:59:59.999
unix time2 es: 1607907599999

No puedo entender qué está causando este error, ni siquiera sé cómo llamarlo o buscarlo.

¿Hay alguna forma de obtener el resultado correcto?

dotnet fiddle: enlace

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el formato de cadena que estás usando para la fecha. Específicamente, estás utilizando “hh” para la parte de la hora de la cadena, lo cual representa la hora en un formato de reloj de 12 horas. Sin embargo, tu cadena de entrada utiliza un formato de reloj de 24 horas, por lo que esto probablemente está causando el problema.

    Para solucionar el problema, simplemente cambia el “hh” en tu formato de cadena por “HH”, lo cual representa la hora en un formato de reloj de 24 horas:

    string format = "yyyyMMdd HH:mm:ss.fff";
    

    Con este cambio, tu salida debería lucir así:

    final1 es: 20201214 13:00:04.156
    tiempo Unix1 es: 1607947204156
    final2 es: 20201214 12:59:59.999
    tiempo Unix2 es: 1607947199999
    

    Esto debería proporcionarte los sellos de tiempo Unix correctos para tus cadenas de entrada.

Comments are closed.