C# 我如何像数字一样计算时间

C# 我如何像数字一样计算时间,c#,sql,time,C#,Sql,Time,大家好,我正在C上做一个应用程序,现在我有一个疑问 我需要表示相对时间,例如我有02:30:00,我需要说是2,5小时 我该怎么做,我需要2位小数,这是我到目前为止所做的,但我给出了时间跨度的误差 private string Horas_Matutinas(string cedula, DateTime desde, DateTime hasta) { string respuesta = ""; DateTime resto = Convert.ToD

大家好,我正在C上做一个应用程序,现在我有一个疑问

我需要表示相对时间,例如我有02:30:00,我需要说是2,5小时

我该怎么做,我需要2位小数,这是我到目前为止所做的,但我给出了时间跨度的误差

private string Horas_Matutinas(string cedula, DateTime desde, DateTime hasta)
    {
        string respuesta = "";
        DateTime resto = Convert.ToDateTime("00:00:00");
        //Llamo la conexion SQL
        SqlConnection Wdcon_usuario = new SqlConnection(WDcon);
        SqlCommand usuario = new SqlCommand();
        SqlDataReader usuarioDR = null;
        TimeSpan tiempo = Convert.ToDateTime("00:00:00") - Convert.ToDateTime("00:00:00");
        //Instancio la conexion SQL
        usuario.Connection = Wdcon_usuario;

        //Registro el Query SQL
        usuario.CommandText = "SELECT * FROM matutino WHERE " +
        "(cedula = @ID) AND " +
        "(desde >= @DESDE) AND " +
        "(hasta <= @HASTA)";
        usuario.Parameters.AddWithValue("@ID", Convert.ToInt64(cedula));
        usuario.Parameters.AddWithValue("@DESDE", Convert.ToDateTime(desde));
        usuario.Parameters.AddWithValue("@HASTA", Convert.ToDateTime(hasta));

        //Abro la conexion
        Wdcon_usuario.Open();

        //Ejecuto la consulta
        usuarioDR = usuario.ExecuteReader();

        //Empiezo el ciclo
        while (usuarioDR.Read())
        {
            TimeSpan tiempX = (DateTime)usuarioDR["tiempotrbajado"] - resto;
            tiempo = tiempo + tiempX;
            Double tiemp = Convert.ToDouble(tiempo);
            respuesta = tiempo.ToString("0.00");

        }
        //Cierro la conexion
        Wdcon_usuario.Close();
        //Termino la sentencia SQL

        //int i = 0;
        int total = 8;
        int caracteres = respuesta.Length;
        int restantes = total - caracteres;

        //respuesta.PadLeft(restantes, "0");


        string s = new String('0', restantes) + respuesta;
        return s;
    }

试着换掉这条线

Double tiemp = Convert.ToDouble(tiempo);
用这个

Double tiemp = tiempo.TotalHours;

Timespan.TotalHours将返回Timespan的完整小时数和分数小时数,这是您想要的

看起来您需要两个时间之间的差异,此示例可能会对您有所帮助

DateTime now = DateTime.Now;
DateTime later = DateTime.Now.AddHours(2.5);
double diff = (later - now).TotalHours;
var x = String.Format("{0:0.00}", diff);
此外,您还可以创建resto和tiempo,而无需使用Convert。相反,您可以使用:

DateTime resto = DateTime.Now.Date;
TimeSpan tiempo = new TimeSpan();

TimeSpan.TotalHours属性看起来像您想要的。它返回TimeSpan的总时间值,表示为整小时和分数小时。然后,您可以对该值进行四舍五入,该值将是Math所需小数位数的两倍。四舍五入,并使用ToString重载对其进行格式化,该重载采用CultureInfo或指定的格式字符串。

您可能需要这样获得时间跨度: TimeSpan tiempX=TimeSpandateTimeUsariodr[Tiemptrbajado]-resto

然后使用标准TimeSpan格式字符串之一格式化结果:

您可以在SQL Server中执行此操作我假设您正在使用SQL Server。。。这是一个丑陋的示例,但您可以附加结果或仅转换结果:

选择SUBSTRINGCASTCONVERTTIME,GETDATE作为字符20、0、3 作为horas,CASTSUBSTRINGCASTCONVERTTIME,GETDATE作为 字符20、4、2为浮动/60*100为分钟

很多功能,但这就是想法。获取日期我使用getDate,您可以使用您的列。。。在我的例子中,将其转换为时间,因为我不想要示例的日期。将它转换为char,这样我们就可以对它进行子串以获得小时或分钟,并在分钟内将y转换为float进行除法,得到关系30=.5


只是一个想法。

您得到了什么异常?我使用了这个,但现在我在respuesta=tiempo.ToString0.00的行中得到了另一个错误;这是错误输入字符串的格式不正确。您需要在ToString方法可用的不同格式选项上检查这两个页面,并尝试只使用不带参数的ToString或只使用两个小数点的ToString。因此,您正在将总小时数存储在变量tiemp中,但您正在尝试提取字符串来自tiempo。尝试更改行respuesta=tiempo.ToString0.00;to respuesta=tiemp.ToStringF;