函数解析DateTime

时间:2017-01-18 01:02:09

标签: c# datetime

我一直在使用这个函数,我将它放在一起以DateTime格式提取MM/DD/YYYY HH:MM:SS PM。我正在解析的Excel文件现在正在被修改,要拆分的字符现在是 EITHER a +-,而之前 ONLY < / strong> a +

我试图修改我的语法来获取一个字符数组,但是这样做我现在得到2个编译错误:

  

参数1:无法转换为&#39; string []&#39;到&#39; char&#39;

  最好的重载方法匹配&#39; string.IndexOf(char)&#39;有一些无效的论点

如何更新以接受一组字符?

将传递给函数的2种样本格式为:

07/22/2016 05:22:00 PM + 00:00
07/22/2016 12:00:00 AM - 04:00

功能是:

public static string FormatToUsableDateTime(string DateToConvert)
{
    convertedDateTime = null;
    var charstocheck = new[]
    {
        "+",
        "-"
    };
    int index = DateToConvert.IndexOf(charstocheck);
    convertedDateTime = (index > 0 ? DateToConvert.Substring(0, index) : "");
    return convertedDateTime;
}

4 个答案:

答案 0 :(得分:2)

您可以使用IndexOfAny method

var charstocheck = new[]
{
    '+',
    '-'
};
int index = DateToConvert.IndexOfAny(charstocheck);

请注意,IndexOfAny接受char而不是string的数组,因此我将chartocheck的类型更改为char[]

答案 1 :(得分:2)

因为您在var变量中使用charstocheck并且没有明确说明数据类型,所以编译器将其指定为string[],从您放置数据的方式来判断(通过包装他们用“......”代替“......”)

此外,IndexOf只会检查单个字符,因此您无法将数组(无论是string[]还是char[])作为输入。

您可以做的是检查 string中存在哪个字符(+或 - )以及IndexOf中使用的:

public static string FormatToUsableDateTime(string DateToConvert)
{
    convertedDateTime = null;
    char chartocheck = DateToConvert.Contains('+') ? '+' : '-';
    int index = DateToConvert.IndexOf(chartocheck);
    convertedDateTime = (index > 0 ? DateToConvert.Substring(0, index) : "");
    return convertedDateTime;
}

这符合这种情况,因为您只需要检查两个字符, +或 - 。如果要检查的字符数超过两个,则可以考虑使用IndexOfAny

修改

BACON指出,“检查是否存在”以及“使用 - 如果存在”的模式在大多数情况下效率低下,我同意这一点。 “检查并使用 - 如果存在”通常是更好的解决方案。因此,上述代码可以替换为IndexOfAny(如BACON回答)或

int index = DateToConvert.IndexOf('+'); //guess what is more often to come
if (index < 0) //if proven wrong, guess take the other
    index = DateToConvert.IndexOf('-');

更有效的解决方案。

答案 2 :(得分:1)

这是因为。IndexOf()方法,它有9个重载选项但没有人接受字符串数组作为输入参数。你必须做这样的事情:

int index = DateToConvert.IndexOfAny(charstocheck);

这将返回指定Unicode字符数组中此字符串中任何字符的第一次出现的从零开始的索引。但在这种情况下,您应该将charstocheck从字符串数组更改为如下字符数组:

var charstocheck = new[] { '+', '-' };

答案 3 :(得分:1)

如果您查看日期,07/22/2016 05:22:00 PM + 00:00问题,我提出的问题+ 00:00就是+00:00之间的空格所以如果我们删除该空格,将能够像这样

解析字符串中的确切日期
string smdt = "07/22/2016 05:22:00 PM + 00:00";
//Find the character. if it is + or -
string chartocheck = smdt.Contains("+") ? "+" : "-";
//Remove the space between the + / - and time
string Correctedsmdt = smdt.Replace(chartocheck + " ", chartocheck);
//This is the string format which is going to parse the Date
string format = "MM/dd/yyyy h:mm:ss tt zzz";
DateTime dt = DateTime.ParseExact(Correctedsmdt, format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal);