Как рассчитать время как числа - PullRequest
1 голос
/ 04 февраля 2012

Привет, люди, я делаю приложение на C #, и теперь я сомневаюсь.

Мне нужно представить относительное время, например, у меня есть 02:30:00, мне нужно будет сказать, что это 2, 5 часов.

Как я могу это сделать, и мне нужно, чтобы это было с двумя десятичными знаками, вот что я сделал до сих пор, но я выдаю мне ошибки с временным интервалом

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;
    }

Ответы [ 5 ]

1 голос
/ 04 февраля 2012

Похоже, вам нужна разница между двумя здесь, этот пример может вам помочь.

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();
1 голос
/ 04 февраля 2012

Попробуйте заменить эту строку

Double tiemp = Convert.ToDouble(tiempo);

С этим

Double tiemp = tiempo.TotalHours;

Timespan.TotalHours будет возвращать временной промежуток как целые и дробные часы, что, как вам кажется, нужно

0 голосов
/ 04 февраля 2012

Вы можете сделать это в SQL Server (я полагаю, вы используете SQL Server) ... это ужасный пример, но вы можете добавить результаты или просто преобразовать их:

ВЫБРАТЬ ПОДПИСЬ (CAST (CONVERT (TIME, GETDATE ()) AS char (20)), 0, 3) AS horas, CAST (ПОДПИСЬ (CAST (КОНВЕРТ (ВРЕМЯ, ПОЛУЧЕНИЕ) (AS) AS char (20)), 4, 2) AS float) / 60 * 100 AS minutos

Много функций, но это идея. Получить дату (я использую getDate (), вы можете использовать свой столбец) ... преобразовать ее во время (в моем случае, потому что я не хочу указывать дату в примере). Приведите его к типу char, чтобы мы могли вывести его в подстроки, чтобы получить часы или минуты, а через несколько минут y - как float, чтобы разделить и получить соотношение (30 = .5).

Просто идея.

0 голосов
/ 04 февраля 2012

Возможно, вам нужно получить TimeSpan следующим образом: TimeSpan tiempX = (TimeSpan)((DateTime)usuarioDR["tiempotrbajado"] - resto);

Затем отформатируйте результат, используя одну из строк стандартного формата TimeSpan: http://msdn.microsoft.com/en-us/library/ee372286.aspx

0 голосов
/ 04 февраля 2012

Свойство TimeSpan.TotalHours выглядит так, как вам нужно.Возвращает общее значение времени TimeSpan, выраженное как целые и дробные часы.Затем вы можете округлить это значение (оно будет в два раза) до любого десятичного знака, который вам может понадобиться с помощью Math.Round (), и отформатировать его для отображения, используя перегрузку ToString (), которая принимает CultureInfo, или указанный форматстрока.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...