Arhn - архитектура программирования

Как проверить, содержит ли строка дату?

Я пытаюсь повторить DataSet, это содержит результаты запроса, такого как SELECT * FROM tb 1, теперь первые три поля содержат дату, формат, сохраненный в таблице базы данных, таков:

yyyy-MM-dd HH:mm:ss

но код возвращает это:

yyyy/MM/dd HH:mm:ss

в частности это:

For z = 1 To ds.Tables(0).Columns.Count - 1

    Console.WriteLine(ds.Tables(0).Rows(x)(z).ToString())

Next

Поэтому мне нужно распознать, имеет ли текущая строка этот формат: yyyy/MM/dd HH:mm:ss, и разобрать ее на: yyyy-MM-dd HH:mm:ss Мне сложно использовать шаблон regex для ее распознавания, но я не эксперт по регулярным выражениям. В любом случае, если есть другое решение, я буду рад увидеть. Обратите внимание, что только первые три значения и последнее в таблице являются датой, остальные значения не являются датой, а содержат целое число или другое строковое значение.

13.01.2016

  • Является ли столбец db строкой или датой? 13.01.2016
  • Столбец - это DATETIME, если я неправильно форматирую дату, как показано, я получаю это значение 0000-00-00 00:00:00 13.01.2016
  • Даты не имеют формата (форматы - это то, как мы показываем их пользователям, или пользовательский интерфейс показывает его вам)... столбец в таблице данных должен быть правильным типом NET DateTime, если вы не применили преобразование в SQL 13.01.2016
  • Конечно, но когда я выполняю вставку, обычно делаю это: Date.Now.ToString(yyyy-MM-dd HH:mm:ss), поэтому я применяю формат даты для вставки. Теперь я должен применить этот формат к значению, имеющему следующий макет: гггг/мм/дд ЧЧ:мм:сс, потому что БД не распознает этот формат 13.01.2016
  • Даты не имеют формата. Поставщик данных MySql знает, как преобразовать тип NET DateTime в тип MySql DATETIME, который вам не нужно преобразовывать в строку. Вы можете отформатировать вывод или то, что показано, как вам нравится. В вашем коде прочитайте объект DataTable в DateTime var, а затем отформатируйте вывод, как вам нравится. 13.01.2016
  • @Plutonix, вы неправильно поняли вопрос. Я не спрашиваю, как отформатировать дату, я спрашиваю, как я могу распознать строку, имеющую определенный формат 13.01.2016
  • Я думаю, что здесь есть и другие проблемы, но вы можете просто заменить / на - в строке. Можете ли вы показать нам код, который вы используете для вставки в базу данных? Параметр должен обрабатывать такие вещи, поэтому мне интересно, можете ли вы объединять значения. 13.01.2016

Ответы:


1

Даты не имеют формата. Из MSDN:

Представляет момент времени, обычно выражаемый в виде даты и времени суток.
...
Значения времени измеряются в 100-наносекундных единицах, называемых тактами, а конкретная дата – это количество тактов с 12:00. полночь, 1 января 0001 г. н.э. (н.э.) в календаре GregorianCalendar... Например, значение тика 31241376000000000L представляет дату, пятница, 01 января, 01:00 12:00:00 полночь.

Итак, DateTime — это просто большое число. Представление их в виде "дд/мм/гггг" является частью магии типа DateTime. Часть проблемы заключается в следующем:

Console.WriteLine(ds.Tables(0).Rows(x)(z).ToString())

Элементы строки: Object. Он не будет действовать как тип DateTime, если/пока вы не введете его в переменную DateTime. Это печатается как DateTime простое, потому что DataTable знает базовый тип; но он будет использовать формат по умолчанию для вашей культуры. Из-за этого выглядит так, будто даты имеют встроенный формат (или даже что "формат изменился", если вы попытались установить его на что-то), но вы человек, и 635882810022222112L не имеет смысла для большинства из нас.

Чтобы изменить стиль вывода, вам сначала нужно передать его в переменную DateTime. Очевидно, предварительным шагом является определение того, является ли произвольный столбец датой. Вместо проверки «формата» вывода проверьте базовый тип данных. Это предполагает правильный столбец DateTime в DataTable:

If ds.Tables(0).Columns(n).DataType = GetType(DateTime) Then
    '...
End If
' Or:
If ds.Tables(0).Rows(x)(z).GetType Is GetType(DateTime) Then
    '...
End If

Затем, чтобы изменить отображение, сначала введите его в переменную DateTime:

Dim dt As DateTime
If ds.Tables(0).Rows(x)(z).GetType Is GetType(DateTime) Then
    dt = Convert.ToDateTime(ds.Tables(0).Rows(x)(z))
    ' cant change "format" but you can change how it displays:
    Console.WriteLine(dt.ToLongDateString)
    Console.WriteLine(dt.ToString("yyyy-MM-dd HH:mm tt"))
    Console.WriteLine(dt.ToString("dd MMM, yyyy"))
End If

Более простой способ получить и преобразовать в DateTime — использовать расширение Field(Of T):

Dim dt = ds.Tables(0).Rows(x).Field(Of DateTime)(y)

when I peform the insert usually do this: Date.Now.ToString("yyyy-MM-dd HH:mm:ss") so I apply a format to date to insert... if I don't format correctly the date as I shown I get this value 0000-00-00 00:00:00

Это не применяет формат к дате. Он преобразует DateTime в строку. Хотя "гггг-ММ-дд ЧЧ:мм:сс" является правильным форматом для использования при передаче данных даты в виде строки в MySql, он не нужен. Поставщик данных MySQL знает, как преобразовать переменную Net DateTime в данные, которые нужны / нужны MySql, и обратно - это его работа.

' this will work fine
cmd.Parameters.Add("@SomeDate", MySqlDbType.DateTime).Value = myDateTimeVar

Требование к формату, о котором вы читали, - это то, что вам нужно использовать в оболочке MySql или пользовательском интерфейсе WorkBench, потому что вы вводите там текст/строку... с клавиатуры. Это не означает, что код должен преобразовывать DateTime переменных в строки в определенном формате для хранения.

13.01.2016

2

Я закончил тем, что использовал это

              Try
                Dim theDate As DateTime = dr.Item(colName)
                Return theDate
            Catch
                ' do something
            End Try

Я был бы рад увидеть лучший метод.

13.01.2016
  • Нет, мне нужен доступ не к имени столбца, а к такой строке (пример кода) => If ds.Tables(0).Rows(x)(z).ToString().HaveThisFormat == yyyy/MM /dd HH:mm:ss, поэтому преобразуйте строку в другой формат. 13.01.2016

  • 3

    Основываясь на том, что вы, кажется, просите, простая замена сделает

    For z = 1 To ds.Tables(0).Columns.Count - 1
    
        Console.WriteLine(ds.Tables(0).Rows(x)(z).ToString().Replace("/","-"))
    
    Next
    

    если он входит с / они меняются на - если он входит с - они остаются нетронутыми.

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

    13.01.2016
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..