将时间缩短到最接近的小时

时间:2014-07-08 12:57:06

标签: c# variables time split rounding

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

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 [0]是我的时间变量(00 / 00/00格式) - 我现在需要四舍五入到最近的小时。我真的不确定如何解决这个问题,任何想法?

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

5 个答案:

答案 0 :(得分:2)

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

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

如果分钟或秒数部分(您的第一个值)不为零,则使用.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
}

答案 1 :(得分:0)

您可以将字符串转换为日期时间吗?

类似的东西:

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

然后进行四舍五入。

答案 2 :(得分: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);

答案 3 :(得分:0)

就我而言,我需要将其四舍五入为小时,然后使用以下逻辑:

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

答案 4 :(得分:0)

您可以尝试一种班轮解决方案,将您的 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());

在线试用:Physics.IgnoreCollision