Преобразование десятичных часов в DD: ЧЧ: ММ
Im пытается конвертировать числовое число часов в дни, часы и минуты.
Это то, что у меня до сих пор, его еще не совсем. Мне нужно вычесть количество часов из дней с части часов, если это имеет смысл?
/// <summary>
/// Converts from a decimal value to DD:HH:MM
/// </summary>
/// <param name="dHours">The total number of hours</param>
/// <returns>DD:HH:MM string</returns>
public static string ConvertFromDecimalToDDHHMM(decimal dHours)
{
try
{
decimal hours = Math.Floor(dHours); //take integral part
decimal minutes = (dHours - hours) * 60.0M; //multiply fractional part with 60
int D = (int)Math.Floor(dHours / 24);
int H = (int)Math.Floor(hours);
int M = (int)Math.Floor(minutes);
//int S = (int)Math.Floor(seconds); //add if you want seconds
string timeFormat = String.Format("{0:00}:{1:00}:{2:00}", D, H, M);
return timeFormat;
}
catch (Exception)
{
throw;
}
}
РЕШЕНИЕ:
/// <summary>
/// Converts from a decimal value to DD:HH:MM
/// </summary>
/// <param name="dHours">The total number of hours</param>
/// <returns>DD:HH:MM string</returns>
public static string ConvertFromDecimalToDDHHMM(decimal dHours)
{
try
{
decimal hours = Math.Floor(dHours); //take integral part
decimal minutes = (dHours - hours) * 60.0M; //multiply fractional part with 60
int D = (int)Math.Floor(dHours / 24);
int H = (int)Math.Floor(hours - (D * 24));
int M = (int)Math.Floor(minutes);
//int S = (int)Math.Floor(seconds); //add if you want seconds
string timeFormat = String.Format("{0:00}:{1:00}:{2:00}", D, H, M);
return timeFormat;
}
catch (Exception)
{
throw;
}
}
Ответы
Ответ 1
Вы можете использовать TimeSpan.FromHours
, чтобы получить промежуток времени, тогда у вас есть все, что вам нужно:
TimeSpan ts = TimeSpan.FromHours(Decimal.ToDouble(dHours));
Например:
int D = ts.Days;
int H = ts.Hours;
int M = ts.Minutes;
Ответ 2
Вам нужно вычесть (D * 24)
из часов... или вы могли бы просто использовать:
int H = ((int) dHours) % 24;
Если вы все равно нажмете на int
, не нужно звонить Math.Floor
. Например, вы можете использовать:
// I'd rename dHours as well, by the way...
int wholeHours = (int) dHours;
int days = wholeHours / 24;
int hours = wholeHours % 24;
int minutse = (int) ((dHours % 1M) * 60);
С другой стороны, вам нужно быть осторожным, если это может быть отрицательным - в этом случае всевозможные вещи могут оказаться вялыми. Если вы не верите, что вам нужно это обработать, я бы явно проверил его и выбросил исключение, если dHours
отрицательно, прежде чем что-либо делать.
(Обратите внимание, что ваш блок try/catch бессмыслен и отвлекает на данный момент. Просто избавитесь от него.)
Ответ 3
Почему бы не сделать что-то подобное?
double d = 25.23523;
Timespan t = TimeSpan.FromHours(d);
Это даст вам:
t = 1.01:14:06.8280000
Затем вы можете запросить объект TimeSpan
по своему усмотрению: http://msdn.microsoft.com/en-us/library/system.timespan.aspx
ПРИМЕЧАНИЕ: TimeSpan.FromHours
требуется вход double
, а не decimal
.
Ответ 4
Simple.
double counter = 0.25;
TimeSpan span = TimeSpan.FromMinutes(counter);
textbox1.Text = span.ToString(@"hh\:mm\:ss");
результат будет 00:00:15 секунд, если счетчик = 1, тогда результат будет 00:01:00 и т.д.
Ответ 5
вот еще одна публикация, которая довольно хороша.
Преобразовать дату в строковый формат yyyy-mm-dd HH: MM: SS - С#
MyDateTime.ToString( "yyyy-MM-dd hh: mm: ss" );
и
http://blog.stevex.net/string-formatting-in-csharp/
Ответ 6
public static string GetTimeString(Decimal dHours)
{
DateTime dTime = new DateTime().AddHours(dHours);
return dTime.ToString("HH:mm:ss"); // HH: 24h or hh: 12h
}