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

问题描述 投票:0回答:6

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

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);
c# variables time split rounding
6个回答
4
投票

将字符串中的日期获取到 DateTime 结构中。例如,请参阅 TryParseExact 方法

然后,您可以根据上一步中的值的年/月/日/小时创建一个新的 DateTime 值,将分和秒部分设置为零(请参阅此处

如果(第一个值的)分钟或秒部分不为零,请使用 .AddHours(1) 添加一小时,这将返回新的日期时间值。

编辑
一些示例代码:

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
}

3
投票

就我而言,我需要将其四舍五入到较低的时间,我使用了以下逻辑:

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

如果您需要四舍五入到最接近的小时(向上或向下),您可以使用以下逻辑:

 int hours = x.Minute >= 30 ? (x.Hour + 1) : x.Hour;
 x = x.Date.AddHours(hours);

1
投票

您可以尝试一种班轮解决方案将您的

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());

在线尝试:.NET Fiddle


1
投票

在 C# 中

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

Now
= 当前时间

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


0
投票

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

类似:

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

然后进行四舍五入。


0
投票

现在正如你所拥有的那样

            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);
© www.soinside.com 2019 - 2024. All rights reserved.