using System;
namespace ConsoleApplication
{
public class Program
{
public static void Main()
{
Console.WriteLine("100ms: " + ToMostNonZeroTime(100));
Console.WriteLine("1000ms: " + ToMostNonZeroTime(1000));
Console.WriteLine("10000ms: " + ToMostNonZeroTime(10000));
Console.WriteLine("100000ms: " + ToMostNonZeroTime(100000));
Console.WriteLine("1000000ms: " + ToMostNonZeroTime(1000000));
Console.WriteLine("10000000ms: " + ToMostNonZeroTime(10000000));
Console.WriteLine("100000000ms: " + ToMostNonZeroTime(100000000));
Console.WriteLine("1000000000ms: " + ToMostNonZeroTime(1000000000));
Console.WriteLine("20000000000ms: " + ToMostNonZeroTime(20000000000L));
Console.WriteLine("200000000000ms: " + ToMostNonZeroTime(200000000000L));
}
static string ToMostNonZeroTime(long ms) {
const int hundretsNanosecondsInMillisecond = 10000;
long ticks = (long)ms * hundretsNanosecondsInMillisecond;
var dt = new DateTime(ticks);
if((dt.Year - 1) > 0) { // starts with 1
double daysToYear = (dt.DayOfYear - 1) * 1.0 / (DateTime.IsLeapYear(dt.Year) ? 366 : 365);
daysToYear += dt.Year - 1;
return $"{daysToYear:0.0} years";
}
if((dt.Month - 1) > 0) {
double daysToMonth = (dt.Day - 1) * 1.0 / DateTime.DaysInMonth(dt.Year, dt.Month);
daysToMonth += dt.Day - 1;
return $"{daysToMonth:0.0} months";
}
// can use TimeSpan then:
var ts = TimeSpan.FromMilliseconds(ms);
if(ts.TotalDays >= 1)
return $"{ts.TotalDays:0.0} days";
if(ts.TotalHours >= 1)
return $"{ts.TotalHours:0.0} hours";
if(ts.TotalMinutes >= 1)
return $"{ts.TotalMinutes:0.0} minutes";
if(ts.TotalSeconds >= 1)
return $"{ts.TotalSeconds:0.0} seconds";
return $"{ms} milliseconds";
}
}
}