Грамматически правильное время безотказной работы в C#

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

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

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

любая помощь приветствуется.

        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
    }

person Jonathan Weinraub    schedule 02.03.2011    source источник
comment
Просто чтобы быть уверенным, вы никогда не планируете, чтобы эта работа была на других языках, верно?   -  person Mark Sowul    schedule 02.03.2011


Ответы (2)


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

TimeSpan upDuration = DateTime.Now - boot;

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

person BrokenGlass    schedule 02.03.2011
comment
Это то, что я собирался сделать - person msarchet; 02.03.2011
comment
о, я вижу, поскольку загрузка выходит за рамки, я просто добавил конструктор перед циклом, чтобы загрузка была доступна вне цикла. спасибо за помощь! - person Jonathan Weinraub; 02.03.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?

person Anderson Matos    schedule 02.03.2011