我有一个日期时间列表,这些日期时间始终保持午夜时间,以及当天网站被视为“启动”的秒数。
我需要算出“正常运行时间”的百分比,所以我需要确切知道当天的秒数。我想知道.NET中是否有类似DateTime.DaysInMonth(年,月)的东西,但是一天中只有几秒钟。
我的Google-fu似乎让我感到失望,我所能找到的只是.NET constant for number of seconds in a day? - 但这并没有考虑到夏令时。
我认为它就像
一样简单var secondsInDay = (startDay.AddDays(1) - startDay).TotalSeconds;
但我想知道这是否正确(简单但不详尽的测试表明它是否正确)? 有没有更有效的方法来计算给定日期的秒数?
请注意 - 这需要考虑夏令时
答案 0 :(得分:1)
我认为您需要使用DateTimeOffset
和TimeZoneInfo
。这个article可以帮助您,特别是比较和算术运算与DateTimeOffset值部分的第二个代码段。
您可以在该代码中看到他们在夏令时日向DateTimeOffset实例添加小时数,结果会考虑时间变化。
编辑:以下代码摘自上述文章(代码未按照您的要求执行,但显示与DateTimeOffset
一起使用的TimeZoneInfo
正在考虑夏令时时间:
public static void Main()
{
DateTime generalTime = new DateTime(2008, 3, 9, 1, 30, 0);
const string tzName = "Central Standard Time";
TimeSpan twoAndAHalfHours = new TimeSpan(2, 30, 0);
// Instantiate DateTimeOffset value to have correct CST offset
try
{
DateTimeOffset centralTime1 = new DateTimeOffset(generalTime,
TimeZoneInfo.FindSystemTimeZoneById(tzName).GetUtcOffset(generalTime));
// Add two and a half hours
DateTimeOffset centralTime2 = centralTime1.Add(twoAndAHalfHours);
// Display result
Console.WriteLine("{0} + {1} hours = {2}", centralTime1,
twoAndAHalfHours.ToString(),
centralTime2);
}
catch (TimeZoneNotFoundException)
{
Console.WriteLine("Unable to retrieve Central Standard Time zone information.");
}
}
// The example displays the following output to the console:
// 3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 4:00:00 AM -06:00
答案 1 :(得分:0)
这个怎么样:
TimeSpan.FromDays(1).TotalSeconds
除非您当然想要计算一天中偶尔添加和删除的秒数以保持地球岁差与时钟一致
对于日光跟踪,您可以检查您的日期是否是
返回的两天之一 TimeZone.CurrentTimeZone.GetDaylightChanges(2013)
并添加/删除Delta
或者您可以通过始终根据过去24小时而不是1天计算正常运行时间来跳过这些恶作剧
答案 2 :(得分:0)
这是一个可以执行您所要求的功能:
public int SecondsInDay(DateTime dateTime, string timeZoneId)
{
var dt1 = dateTime.Date;
var dt2 = dt1.AddDays(1);
var zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
var dto1 = new DateTimeOffset(dt1, zone.GetUtcOffset(dt1));
var dto2 = new DateTimeOffset(dt2, zone.GetUtcOffset(dt2));
var seconds = (dto2 - dto1).TotalSeconds;
return (int) seconds;
}
举个例子:
int s = SecondsInDay(new DateTime(2013, 1, 1), "Central Standard Time");
// 86400
int s = SecondsInDay(new DateTime(2013, 3, 10), "Central Standard Time");
// 82800
int s = SecondsInDay(new DateTime(2013, 11, 3), "Central Standard Time");
// 90000