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

时间:2014-11-12 10:09:54

标签: c# .net datetime

当分钟包含值60

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

我如何正确解析它?

5 个答案:

答案 0 :(得分:3)

传递正确的值(>=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 :(得分:3)

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

所以,基本上有两种解决方案:

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

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

  3. 所以正则表达式的第二个分辨率是直接回答你的问题。但是,请注意&#34; 30/10/14 08:60&#34;无效,必须迟早在数据源中修复。

    顺便说一下,您可以尝试与some regular expressions建立链接。

答案 2 :(得分:2)

国际大会每小时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);

此外,您可以使用它来控制数据和接收消息true / false

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");
     }

答案 3 :(得分:1)

如果您始终知道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]));

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