Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将日期时间缩短/四舍五入为一整,即小时/天?_C# - Fatal编程技术网

C# 将日期时间缩短/四舍五入为一整,即小时/天?

C# 将日期时间缩短/四舍五入为一整,即小时/天?,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

有没有什么数学方法可以把日期时间缩短到一小时、一天左右?类似于小数点到整数的四舍五入

句号 如果原始值为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不能放在迭代中,它依赖于someType

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,并立即跟踪数据源。这意味着整个例程已经由这个循环完成了。