2016-02-16 3 views
1

Я пытаюсь преобразовать формат в String к более Date, используя этот код:DateTime.ParseExact не был признан действительным DateTime

Debug.Print(Trim(oTable.Cell(i + 1, 2).Range.Text.Replace(vbCr, "").Replace(vbLf, ""))) 
Tabledate = DateTime.ParseExact((Trim(oTable.Cell(i + 1, 2).Range.Text.Replace(vbCr, "").Replace(vbLf, ""))), "dd/MM/yy", CultureInfo.InvariantCulture) 

Debug.Print линия дает мне результат 30/12/15, но DateTime.ParseExact линия всегда возвращает ошибку, говорящую, что строка не является допустимым форматом DateTime? Я что-то упускаю?

Примечание: Я должен удалить отставая возврата carragies, поскольку строка поступает из таблицы в слове, и по какой-то причине вытаскивает возвращение на конец строки

UPDATE 1

Прибегая к отчаянным мерам, я включил следующие в моем коде:

For Each A As Char In oTable.Cell(i + 1, 2).Range.Text 
    Debug.Print(A) 
Next 

Это печатает результат:

3 
0 
/
1 
2 
/
1 
5 
(extra blank char) 
(extra blank char) 

Я понятия не имею, где и что это за пустые символы, я попытался заменить vbTab на ничего, но это не имеет значения. Возможно, стоит отметить, что строка изначально была из таблицы в слове, может ли факт, что ее в ячейке на столе имеет какое-то отношение к тому, что представляют собой эти пустые символы?

UPDATE 2

Изменен код отладочный:

For Each A As Char In oTable.Cell(i + 1, 2).Range.Text 
    Debug.Print(CInt(AscW(A))) 
Next 

Возвращается:

51 
48 
47 
49 
50 
47 
49 
53 
13 
7 

, который я считаю, означает 13 возврат каретки (хотя это должно было быть отрезано), а 7 - «звонок» (я не знаю, что такое звонок)

+0

Обновленный вопрос, я хотел оставить его там, если команда 'Trim' или' Replace' является причиной ошибки. Возвращенная строка в вопросе справедлива, его '30/12/15' – SilverShotBee

+0

Невозможно воспроизвести с использованием константы« 30/12/15 », поэтому здесь есть что-то непонятное. Какова ваша реальная информация о локали? – Steve

+0

@SilverShotBee: возможно, есть и другие невидимые персонажи, такие как 'VbTab' внутри. –

ответ

4

Старая функция VB Trim удаляет только пробелы от начала и до конца. Вместо этого используйте метод .NET String.Trim, который удаляет все виды whitespaces, также как и символы табуляции.

Dim celltext = oTable.Cell(i + 1, 2).Range.Text.Replace(vbCr, "").Replace(vbLf, "") 
Tabledate = DateTime.ParseExact(celltext.Trim(), "dd/MM/yy", CultureInfo.InvariantCulture) 

Обратите внимание, что вы также можете использовать DateTime.TryParseExact, если входные данные могут содержать недопустимые даты. Тогда исключение не происходит, но метод возвращает False.


Поскольку у вас есть возврат каретки (не в конце), и колокол (в конце), вы можете использовать этот подход, который должен удалить все нежелательные символы:

Dim celltext = oTable.Cell(i + 1, 2).Range.Text.Trim() 
Dim validChars = From c In celltext Where Char.IsDigit(c) OrElse Char.IsPunctuation(c) 
celltext = New String(validChars.ToArray()) 
Tabledate = DateTime.ParseExact(celltext, "dd/MM/yy", CultureInfo.InvariantCulture) 

Вам нужно для добавления Imports System.Linq в начало файла кода.

+0

Спасибо, это возвращает 'False', поэтому я думаю, что есть проблема, пожалуйста, просмотрите обновленный вопрос – SilverShotBee

+1

@SilverShotBee: так вы пробовали' DateTime.ParseExact (celltext.Trim(), "dd/MM/yy", CultureInfo .InvariantCulture) 'но' celltext.Trim() 'не удалял конечные пробелы? Используйте 'Debug.Print (CInt (A))', чтобы увидеть, какой тип персонажа он есть. –

+0

@Steve, Обновленный снова, интересный подход, чтобы получить код символа! Я запомню это – SilverShotBee

0

Я считаю, что произведенная строка не соответствует правильному рисунку. Обратите внимание: CultureInfo.InvariantCulture нуждается в определенном форматировании даты и времени, чтобы заставить его работать.

CultureInfo c1 = CultureInfo.InvariantCulture; 

Console.WriteLine(c1.DateTimeFormat.ShortDatePattern.ToString()); 
Console.WriteLine(c1.DateTimeFormat.LongDatePattern.ToString()); 

Вы увидите формат, необходимый для использования являются следующими

MM/dd/yyyy 
dddd, dd MMMM yyyy 

DateTime.ParseExact кинет FormatException, потому что стандартный шаблон короткого срока или длинный шаблон даты не последовало.

Смежные вопросы