C# 将日期时间缩短/四舍五入为一整,即小时/天?
有没有什么数学方法可以把日期时间缩短到一小时、一天左右?类似于小数点到整数的四舍五入 句号 如果原始值为2011-01-01 13:00:00,则最终为2011-01-01 00:00:00 如果时间。小时 如果原始值为2011-03-11 13:32:00,则最终为2011-03-11 13:00:00 我在想下面的事情。这当然可以很好地工作,但无论如何,范围数组都会在稍后进行迭代。如果我可以直接在迭代中计算,而不是自己的迭代,那就更好了。但是someType不能放在迭代中,它依赖于someTypeC# 将日期时间缩短/四舍五入为一整,即小时/天?,c#,C#,有没有什么数学方法可以把日期时间缩短到一小时、一天左右?类似于小数点到整数的四舍五入 句号 如果原始值为2011-01-01 13:00:00,则最终为2011-01-01 00:00:00 如果时间。小时 如果原始值为2011-03-11 13:32:00,则最终为2011-03-11 13:00:00 我在想下面的事情。这当然可以很好地工作,但无论如何,范围数组都会在稍后进行迭代。如果我可以直接在迭代中计算,而不是自己的迭代,那就更好了。但是someType不能放在迭代中,它依赖于someT
if (someType == Period.Day)
range.ForEach(d => d.time = new DateTime(d.time.Year, d.time.Month, d.time.Day,0,0,0));
if (someType == Period.Hour)
range.ForEach(d => d.time = new DateTime(d.time.Year, d.time.Month, d.time.Day, d.time.Hour, 0, 0));
四舍五入到一天等于时间。日期,四舍五入到中点最近的一天等于时间+12小时。日期 把时间缩短到一个小时,我想不出比你的代码读起来更好的代码了。要四舍五入到最接近的小时,您可以将代码应用到时间+30分钟 可能有一种更快的四舍五入到最接近的小时的方法:
const Int64 HourInTicks=...;
Int64 timeInTicks=time.Ticks;
Int64 trucatedToHour=timeInTicks-timeInTicks%HourInTicks;
但我会避免这样,除非你真的需要表演,这是不可能的
如果您使用“本地时间”将“我的最接近日期”舍入为“您可以使用的日期”,则“我的最接近日期”在“本地时间”偏移更改的日期可能会出现问题。 要将时间四舍五入到一小时,恐怕您必须使用您在示例中所做的,或者类似于:
d.Date.AddHours(d.Hour)
答案包含一个优秀的通用日期时间舍入方法
编辑:
此答案在更新的问题标题之前,是一种四舍五入到最近值而不是四舍五入的算法。我将执行以下操作:
private static readonly DateTime Epoch = new DateTime(1970, 1, 1);
public static DateTime Round(this DateTime d, Period p)
{
var ts = d - Epoch;
if (p == Period.Hour)
{
var hours = (long)ts.TotalHours;
return Epoch.AddHours(hours);
}
else if (p == Period.Days)
{
var days = (long)ts.TotalDays;
return Epoch.AddDays(days);
}
// ...
}
我相信下面的C代码会将DateTime值四舍五入到最接近的分钟,我认为很容易将其推广到其他单位
//round to nearest minute; add 30 seconds for rounding to nearest minute
effectiveDateTime = effectiveDateTime.AddSeconds(30);
TimeSpan timeComponent = effectiveDateTime.TimeOfDay;
effectiveDateTime = effectiveDateTime.Date;
effectiveDateTime = effectiveDateTime.AddHours(timeComponent.Hours).
AddMinutes(timeComponent.Minutes);
不确定这种方法是否有效,但在这种情况下,使用字符串格式看起来相当不错,可以节省几个小时:
var date = DateTime.UtcNow;
var cutDownDate = Convert.ToDateTime(date.ToString("yyyy-MM-dd hh"));
你的例子不全面。它们会截短/取整。用Select?@CodeInChaos替换ForEach。你完全正确。我将更改标题,因为标题有误。d.AddMinutes-d.Minute to round to minutes呢?@VoidMain看起来不太对劲。你用它将分钟设置为0,但保留秒和一秒的分数。哦,我看了一下,只是接受了答案。Matt W的一个很好的特性。它通过一点修改完全解决了我的问题。使用TimeSpan.FromTicksX进行舍入。我从Period.Month/Period.Days和whola中获取滴答声,这个呼叫是通用的!虽然它没有提供我自己的样本中的任何性能,但我已经完成了两次迭代。发展中国家有时非常不稳定是的,这些好答案之间的性能差异非常小。因此,我最终选择了最具可读性和清晰性的方式,因为功能本身有点模糊。我通过cleardatedate、period方法保留foreach,并立即跟踪数据源。这意味着整个例程已经由这个循环完成了。