Создание даты из текстовой строки - VB.Net - PullRequest
1 голос
/ 20 сентября 2009

У меня проблема с преобразованием строки в нужный мне формат даты. Пример строки, которую я пытаюсь преобразовать, будет 215056081909. Я хотел бы преобразовать эту строку в 19.08.09 21: 50: 56.

Код, указанный ниже, - это то, что я пытаюсь использовать для процесса конвертации. Когда я запускаю код, я получаю сообщение об ошибке ниже, и я почти уверен, что это потому, что моя строка имеет временную часть в военном (24-часовом) времени. Может ли кто-нибудь помочь мне преобразовать строку в нужный мне формат?

Спасибо!

Error:
System.ArgumentOutOfRangeException was unhandled
      Message="Index and length must refer to a location within the string. Parameter name: length"
      ParamName="length"
      Source="mscorlib"
      StackTrace:
           at System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
           at System.String.Substring(Int32 startIndex, Int32 length)
           at GLTracker.PortManager.DoDataCollection(MessageType type, String msg)
           at GLTracker.PortManager.comPort_DataReceived(Object sender, SerialDataReceivedEventArgs e)
           at System.IO.Ports.SerialPort.CatchReceivedEvents(Object src, SerialDataReceivedEventArgs e)
           at System.IO.Ports.SerialStream.EventLoopRunner.CallReceiveEvents(Object state)
           at System.Threading._ThreadPoolWaitCallback.WaitCallback_Context(Object state)
           at System.Threading.ExecutionContext.runTryCode(Object userData)
           at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
           at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading._ThreadPoolWaitCallback.PerformWaitCallbackInternal(_ThreadPoolWaitCallback tpWaitCallBack)
           at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback(Object state)
      InnerException:




'Code:
Dim strDateTime as string = "215056081909"

Dim dTransDate As DateTime = Convert.ToDateTime(String.Format("{0}/{1}/{2} {3}:{4}:{5}", _
                                                                strDateTime.Substring(7, 2), _
                                                                strDateTime.Substring(9, 2), _
                                                                strDateTime.Substring(11, 2), _
                                                                strDateTime.Substring(0, 2), _
                                                                strDateTime.Substring(3, 2), _
                                                                strDateTime.Substring(5, 2)))

Ответы [ 6 ]

7 голосов
/ 20 сентября 2009

Поскольку у вас есть точный формат, вы можете использовать DateTime.ParseExact для предоставления формата и входных данных, чтобы попытаться преобразовать дату:

Dim theDate As DateTime = DateTime.ParseExact("215056081909", _
                                              "HHmmssMMddyy", _
                                              CultureInfo.CurrentCulture)

Возможно, вы захотите использовать DateTime.TryParseExact на случай, если входное значение потенциально искажено:

Dim theDate As DateTime
If DateTime.TryParseExact("215056081909", _
                          "HHmmssMMddyy", _
                          CultureInfo.CurrentCulture, _
                          DateTimeStyles.None, _
                          theDate)) Then
    ' Parsing succeeded, and theDate will contain the parsed date
End If
3 голосов
/ 20 сентября 2009

Я считаю, что строки VB.NET основаны на 0. Ваша самая дальняя правая подстрока начинается с 11 и имеет длину 2. 11 + 2 == 13

1 голос
/ 20 сентября 2009

Я думаю, что вам следует использовать DateTime.TryParse, так как эта функция не будет генерировать исключение, если преобразование в дату не выполнено, она вернет true или false в зависимости от того, успешно преобразовано или нет.

1 голос
/ 20 сентября 2009

Как и выше, ваша ошибка заключается в использовании 1-базовых вместо 0-основанных индексов.

Попробуйте использовать следующие индексы ...

Dim dTransDate As DateTime = _  
    Convert.ToDateTime(String.Format("{0}/{1}/{2} {3}:{4}:{5}", _
        strDateTime.Substring(6, 2), _
        strDateTime.Substring(8, 2), _
        strDateTime.Substring(10, 2), _
        strDateTime.Substring(0, 2), _
        strDateTime.Substring(2, 2), _
        strDateTime.Substring(4, 2)))
0 голосов
/ 20 сентября 2009

Попробуйте DateTime.ParseExact ("215056081909", "HHmmssMMddyy"). ToString ("MM / дд / гг чч: мм: сс")

0 голосов
/ 20 сентября 2009

Зачем использовать метод "string-> convert"? Используйте длинный конструктор: http://msdn.microsoft.com/en-us/library/aa326687%28VS.71%29.aspx

Вы можете проанализировать отдельные части и преобразовать их в целое число, если хотите, но это будет гораздо более явным и должно быть быстрее, поскольку метод convert должен использовать те же методы синтаксического анализа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...