把时间四舍五入到最接近的小时

本文关键字:小时 最接近 时间 四舍五入 | 更新日期: 2023-09-27 18:11:52

ok,基本上我有一个程序,重写文本文件并通过各种条件格式化它们,其中一个条件是原始文本文件中的日期和时间值需要从当前位置删除,并移动到我创建的新列中,这是用下面的代码完成的。我使用正则表达式来查找日期和时间格式,然后将其从当前位置删除,并将值存储在一个变量中,我可以稍后使用…

if (line.Contains(date))
{
    string pattern = @"('d{2}:'d{2}:'d{2}'s?'d{2}/'d{2}/'d{4})";
    string input = line;
    string replacement = "";
    Regex rgx = new Regex(pattern);
    date1 = rgx.Match(input).ToString();
    string result = rgx.Replace(input, replacement);
    line = result;
}

这个返回的新值同时获得时间和日期值,但只作为一个字符串,所以我然后使用split(如下所示)将两个值分开,现在split[0]是我的时间变量(00/00/00格式)-现在我需要将其四舍五入到最近的小时。我真的不知道该怎么做,有什么主意吗?

string[] split = date1.Split(' ');                
writer.WriteLine(split[0] + "'t" + split[1] + "'t" + line);

把时间四舍五入到最接近的小时

将日期从字符串中获取到DateTime结构体中。参见TryParseExact方法

然后您可以创建一个新的DateTime值,基于上一步的值的年/月/日/小时,将分和秒部分设置为零(见这里)

如果(第一个值的)分或秒部分不为零,使用. addhours(1)添加一个小时,它返回一个新的DateTime值。

编辑
一些示例代码:

string inputdate = "2:56:30 8/7/2014";
DateTime dt;
System.Globalization.CultureInfo enUS = new System.Globalization.CultureInfo("en-US");
if (DateTime.TryParseExact(inputdate, "H:m:s d/M/yyyy", // hours:minutes:seconds day/month/year
    enUS, System.Globalization.DateTimeStyles.None, out dt))
{
  // 'dt' contains the parsed date: "8-7-2014 02:56:30"
  DateTime rounded = new DateTime(dt.Year, dt.Month, dt.Day, dt.Hour, 0, 0);
  if (dt.Minute > 0 || dt.Second > 0) // or just check dt.Minute >= 30 for regular rounding
    rounded = rounded.AddHours(1);
  // 'rounded' now contains the date rounded up: "8-7-2014 03:00:00"
}
else
{
  // not a correct date
}

在我的例子中,我需要把它四舍五入到更低的小时,我使用了这个逻辑:

DateTime x = new DateTime();
x = x.Date.AddHours(x.Hour);

您可以尝试一个线性解决方案将您的DateTime转换为最近的小时,

//Input DateTime
DateTime input = DateTime.ParseExact("28/05/2021 2:16 PM", "dd/MM/yyyy h:mm tt", CultureInfo.InvariantCulture);
//Ternary Operation
var output = input.Minute > 30  //Check if mins are greater than 30
       ? input.AddHours(1).AddMinutes(-input.Minute) //if yes, then add one hour and set mins to zero
       : input.AddMinutes(-input.Minute); //otherwise set mins to zero
Console.WriteLine(result.ToString());

Try Online: .NET Fiddle

能否将字符串转换为日期时间?

类似:

dateVariable = Convert.ToDateTime(dateString);
int hour = dateVariable.Hour;
int minute = dateVariable.Minute;

然后四舍五入

现在你有

            string[] str = split[1].Split('/');
            // create a new DateTime
            int minutes = int.Parse(str[1]);
            if(minutes >= 30)
                  hour = int.Parse(str[0]) + 1 // make sure if it 13 or 25 make it 1
                  minutes = 0 ;
                  sec = 0;
            else {
                 hour = int.Parse(str[0]);
                 minutes = 0 ;
                 sec = 0 ;
            }
            var myDate = new Date(Year, month , day , hour , minutes , sec);

In c#

var Now = DateTime.Now;
var Nearest = Now.Date;
Nearest = Nearest.AddHours(Now.Hour + (Now.Minute >= 30 ? 1 : 0));

Now =当前时间

Nearest =四舍五入到最接近的小时