如何用分钟分析日期包含值60

本文关键字:日期 包含值 何用 分钟 | 更新日期: 2023-09-27 18:30:09

当分钟包含值60 时,我得到异常

var date = "30/10/14 08:60";
var result = DateTime.ParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None);

如何正确解析??

如何用分钟分析日期包含值60

要么传递一个正确的值(>=0 || <=59),要么使用这个:

var date = "30/10/14 08:60";
DateTime dateResult;
bool canParse = DateTime.TryParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out dateResult);
if (!canParse)
{
    string datePart = date.Split().First();
    DateTime dtOnly;
    if (DateTime.TryParseExact(datePart, "dd/MM/yy", CultureInfo.InvariantCulture, DateTimeStyles.None, out dtOnly))
    {
        string timePart = date.Split().Last();
        string hourPart = timePart.Split(':')[0];
        string minutePart = timePart.Split(':').Last();
        int hour, minute;
        if (int.TryParse(hourPart, out hour) && int.TryParse(minutePart, out minute))
        {
            TimeSpan timeOfDay = TimeSpan.FromHours(hour) + TimeSpan.FromMinutes(minute);
            dateResult = dtOnly + timeOfDay;  // 10/30/2014 09:00:00
        }
    }
}

首先,数据无效,这就是引发异常的原因。

因此,基本上有两种分辨率:

  1. 如果数据来自第三方,我的建议是,在咨询您的老板或公司的律师后,您/您的公司要求第三方提供有效数据,因为您没有法律义务为第三方修复/容忍无效数据。IMO,你不应该。

  2. 如果数据来自您的遗留内部系统,您/公司应该修复可能产生60的错误。如果由于某些原因无法很快修复这些错误,您可以编写一个解析器,例如使用正则表达式来解析数据并容忍60。

因此,正则表达式的第二个解决方案是直接回答您的问题。但是,请注意,"30/10/14 08:60"无效,必须在数据源中尽快修复。

顺便说一句,这里有一些你可以尝试的正则表达式的链接。

对于国际会议来说,是一小时60分钟。第60分钟应该是59,事实上,如果你从0到59计数,就会发现它们是60个数字。你写的8:60的日期不存在,它们的值是9:00。

试试这个(显然只有date1会引发异常):

var date = "30/10/14  8:59";
var date1 = "30/10/14 9:00";

var result = DateTime.ParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None);
var result1 = DateTime.ParseExact(date1, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None);

此外,您可以使用它来控制数据并接收消息真/假

var date = "30/10/14 08:60";
DateTime outData;
Boolean flagCorrectData = DateTime.TryParseExact(date, "dd/MM/yy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.None, out outData);
     if (flagCorrectData)
     {
        MessageBox.Show("Date correct");
     }
     else
     {
        MessageBox.Show("Date error");
     }

如果您总是知道date字符串的时间部分是否为HH:mm格式,则可以执行此操作以获得正确的DateTime date:

    string dateString = "30/10/14 08:60";
    string[] dateParts = dateString.Split(' ');
    DateTime date = DateTime.ParseExact(dateParts[0],"dd/MM/yy",CultureInfo.InvariantCulture);
    string[] timeParts = dateParts[1].Split(':');
    date=date.AddMinutes(double.Parse(timeParts[0])*60+double.Parse(timeParts[1]));

如果你只关心:60的特殊情况,你可以在ParseExact中显式地使用60:

string date = "30/10/14 08:60";
DateTime result;
if(DateTime.TryParseExact(date, "dd/MM/yy HH:mm", 
    CultureInfo.InvariantCulture, DateTimeStyles.None,out result)) 
{
    return result;
}    
//Handle weird :60
if(DateTime.TryParseExact(date, "dd/MM/yy HH:60",
        CultureInfo.InvariantCulture, DateTimeStyles.None,out result))
{
    return result.AddMinutes(60);
}
throw new ArgumentException("date");