Грамматически правильное время работы в C # - PullRequest
3 голосов
/ 02 марта 2011

Я хочу вернуть строку, которая является грамматически правильной для отображения текущего времени безотказной работы.Например, 3 года, 7 месяцев, 11 дней, 1 час, 16 минут и ноль секунд, что означает, что единичные единицы не должны быть множественными, а нулевые единицы должны быть множественными, хотя ноль не должен отображаться, если это еще не произошло(например, не отображать годы, месяцы и т. д., если это еще не произошло)

Поскольку метод тиков не будет работать более месяца, я использую ManagementObject, но я запутался вкак выполнять вычисления даты и времени (я очень плохо знаком с C #, поэтому я делаю утилиту, которая выполняет множество функций, чтобы я мог учиться различным вещам.

это то, что у меня есть сейчас,и это не чертовски много ...

любая помощь очень ценится.

        public string getUptime()
    {
        // this should be grammatically correct, meaning, 0 and greater than 1 should be plural, one should be singular
        // if it can count in realtime, all the better
        // in rare case, clipping can occur if the uptime is really, really huge

        // you need a function that stores the boot time in a global variable so it's executed once so repainting this won't slow things down with quer
        SelectQuery query = new SelectQuery("SELECT LastBootUpTime FROM Win32_OperatingSystem WHERE Primary='true'");
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
        foreach (ManagementObject mo in searcher.Get())
        {
            // this is the start time, do math to figure it out now, hoss
            DateTime boot = ManagementDateTimeConverter.ToDateTime(mo.Properties["LastBootUpTime"].Value.ToString());
            // or is it better to break up everything into days/hours/etc, i think its better to do that at the end before it gets returned
        }

        string now = DateTime.Now.ToShortDateString();







        return "3 years, 7 months, 11 days, 1 hour, 16 minutes and zero seconds";  // long string for testing label width
    }

Ответы [ 2 ]

5 голосов
/ 02 марта 2011

Не преобразовывать в строку - используйте DateTime последнего времени перезагрузки, которое у вас уже есть, и сравните его с текущим временем (DateTime.Now). Вычтите два, и вы получите TimeSpan:

TimeSpan upDuration = DateTime.Now - boot;

TimeSpan имеет свойства Days, Hours, Minutes, которые вы теперь можете использовать для построения своей строки.

0 голосов
/ 02 марта 2011

Поиск в интернете Я нашел кое-что, что привело меня в эти псевдоклассы.Может работать ...

class Utils
{

    public DateTime GetLastDateTime()
    {
        // Insert code here to return the last DateTime from your server.
        // Maybe from a database or file?

        // For now I'll just use the current DateTime:
        return DateTime.Now;
    }

    public CustomTimeSpan GetCurrentTimeSpan()
    {
        // You don't actually need this method. Just to expalin better...
        // Here you can get the diference (timespan) from one datetime to another:

        return new CustomTimeSpan(GetLastDateTime(), DateTime.Now);
    }

    public string FormatTimeSpan(CustomTimeSpan span)
    {
        // Now you can format your string to what you need, like:

        String.Format("{0} year{1}, {2} month{3}, {4} day{5}, {6} hour{7}, {8} minute{9} and {10} second{11}",
            span.Years, span.Years > 1 ? "s" : "",
            span.Months, span.Monts > 1 ? "s" : "",
            span.Days, span.Days > 1 ? "s" : "",
            span.Hours, span.Hours > 1 : "s" : "",
            span.Minutes, span.Minutes > 1 : "s" : "",
            span.Seconds, span.Seconds > 1 : "s" : "");
    }

}

class CustomTimeSpan : TimeSpan
{

    public int Years { get; private set; }
    public int Months { get; private set; }
    public int Days { get; private set; }
    public int Hours { get; private set; }
    public int Minutes { get; private set; }
    public int Seconds { get; private set; }

    public CustomTimeSpan ( DateTime originalDateTime, DateTime actualDateTime )
    {
        var span = actualDateTime - originalDateTime;

        this.Seconds = span.Seconds;
        this.Minutes = span.Minutes;
        this.Hours = span.Hours;

        // Now comes the tricky part: how to get the day, month and year part...
        var months = 12 * (actualDateTime.Year - originalDateTime.Year) + (actualDateTime.Month - originalDateTime.Month);
        int days = 0;

        if (actualDateTime.Day < originalDateTime.Day)
        {
            months--;
            days = GetDaysInMonth(originalDateTime.Year, originalDateTime.Month) - originalDateTime.Day + actualDateTime.Day;
        }
        else
        {
            days = actualDateTime.Day - originalDateTime.Day;
        }

        this.Years = months / 12;
        months -= years * 12;
        this.Months = months;
        this.Days = days;
    }


}

Кредиты от базового кода Бобу Сколе. Как рассчитать возраст, используя TimeSpan с .NET CF?

...