我想返回一个字符串,这在语法上是正确的,以显示当前的正常运行时间。例如,3年,7个月,11天,1小时,16分钟和零秒,意味着单数单位不应该是复数,零单位应该是复数,但如果尚未出现则不应显示零(例如,如果尚未显示年份,月份等,则不显示)
由于ticks方法不会超过一个月,我使用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
}
答案 0 :(得分:5)
不要'转换为字符串 - 使用您已经拥有的上次重启时间的DateTime
并将其与当前时间(DateTime.Now
)进行比较。减去这两个,你得到一个TimeSpan
:
TimeSpan upDuration = DateTime.Now - boot;
TimeSpan
具有您可以用来构建字符串的属性Days,Hours,Minutes。
答案 1 :(得分:0)
搜索互联网我发现了一些导致我进入这些伪类的东西。 可能会工作......
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;
}
}
从基本代码到Bob Scola的积分。 How to calculate age using TimeSpan w/ .NET CF?