2017-01-18 2 views
1

Я использую эту функцию, которую я собрал, чтобы извлечь DateTime в формате MM/DD/YYYY HH:MM:SS PM. Ну файл Excel, который я разборе теперь изменяется и характер разделить на теперь ЯВНО+ или -, тогда как раньше это было ТОЛЬКО+Функция для анализа DateTime

Я попытался изменить свой синтаксис, чтобы взять массив символов, но при этом такой я теперь получить 2 ошибки компиляции:

Аргумент 1: не удается преобразовать из «строку []» на «» полукокса

лучший перегруженный метод матча для «String.indexOf (char) 'имеет некоторые недопустимые аргументы

Как это можно обновить, чтобы принять массив символов?

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; 
} 
+0

Используйте 'DateTime.ParseExact'. – Dai

ответ

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

Edit:

BACON указывает на то, что картина «проверить, если существовать», а затем «использовать, если существовать» неэффективен большую часть времени, и я согласен с этим. «check-and-use-if-exist» часто является лучшим решением.Выше код может таким образом быть заменен IndexOfAny (как ответил БЕКОНОМ) или,

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

Для более эффективного решения.

+0

Гораздо чище, чем мой код, и отлично работает, спасибо! –

+0

@MichaelMormon приветствуется. ;) – Ian

+0

Обратите внимание, что 'DateToConvert.Contains' будет сканировать символ' DateToConvert' символом, пока не найдет '' + ''или не достигнет конца строки, но не записывает, где он нашел' '+'', если он сделал. Затем 'DateToConvert.IndexOf' снова будет сканировать символ' DateToConvert' символом, пока не найдет 'chartocheck' (что, опять же, вполне может быть' '+ '', которое оно уже расположено в предыдущей строке). Это не очень эффективный способ сделать это, и, на мой взгляд, не делает код более понятным. – BACON

2

Вы можете использовать IndexOfAny method:

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

Обратите внимание, что IndexOfAny принимает массив char, а не string, поэтому я изменил тип chartocheck на char[].

+0

upvoted, после вашего комментария в моем ответе – Ian

1

Это было из-за. IndexOf(), он имеет 9 перегруженных опций, но никто не примет строковый массив в качестве входного параметра. Вы должны сделать что-то вроде этого:

int index = DateToConvert.IndexOfAny(charstocheck); 

который будет возвращает отсчитываемый от нуля индекс первого вхождения в данном случае какого-либо символа в заданном массиве символов Unicode. Но в этом случае вы должны изменить charstocheck из массива строк в массив символов, например так:

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

простое изменение из двойных кавычек в одинарные кавычки изменило бы его на полезный ввод (в этом случае измените строку на символ)? –

+0

у вас есть использовать 'IndexOfAny' вместо' IndexOf' и изменить strin g array для массива char, изменив строку на char –

+0

. [9 'IndexOf' перегрузки] (https://msdn.microsoft.com/library/system.string.indexof.aspx) определены в классе' string' и являются а не методы расширения, но это в противном случае правильно. – BACON

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); 
Смежные вопросы