Десятичные значения распознаются как DateTime вместо возврата false из DateTime.Parse

9

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

string val = "3.5";
DateTime oDate = DateTime.Parse(val);

Возвращает действительную дату 3/5/2019.

Как проверить строку, чтобы узнать ее действительную дату, когда формат даты неизвестен?

Мунавар
источник
6
Сначала проверьте десятичность? Или используйте, DateTime.ParseExactесли вы знаете, какие форматы он может / должен использовать
друг
3
Вы можете использовать TryParseExactи указать допустимые форматы даты.
Juharr
5
Действительно - DateTime.Parseпробует несколько шаблонов. Если вы хотите распознать только определенные, попробуйте разобрать их специально.
Джон Скит

Ответы:

3

"Как проверить строку, чтобы узнать ее действительную дату?"

Вопрос заключается в том , что "3.5" это считается действительной датой (а также в десятичной системе ).

Если вы хотите, чтобы десятичный тип всегда «побеждал» (то есть вы не хотите isDateи isDecimalоба должны быть true), включите десятичную проверку в вашу проверку.

Один из способов сделать это - использовать TryParseметоды (которые возвращают a, boolесли строка может быть проанализирована с типом, и который устанавливает outпараметр для преобразованного значения), чтобы определить, может ли строка быть преобразована в тип, например:

string val = "3.5";

// temp variables to hold parsed values
DateTime tmpDate;
decimal tmpDec;
int tmpInt;

var isDecimal = decimal.TryParse(val, out tmpDec);
var isInteger = int.TryParse(val, out tmpInt);

// When checking if it's a DateTime, make sure it's not also a decimal
var isDate = !isDecimal && DateTime.TryParse(val, out tmpDate);
Руфус Л
источник
Я уже пробовал, но 3.5 является действительной датой и действительным десятичным числом, так что это не помогает вообще.
Мунавар
1
В приведенном выше коде, isDateэто falseпотому , что она включает в себя проверку isDecimal. Разве это не то, что вы просили?
Руфус Л
2
@Munawar - «3.5 - точная дата и действительный десятичный знак». Если мы, люди, представляем эту строку и никакого другого контекста, мы не знаем, была ли она предназначена для даты, для десятичной точки или для чего-то еще . Вы не можете ожидать, что компьютер волшебным образом получит ответ на него.
Damien_The_Unbeliever
Да, этот ответ специфичен для данной проблемы и решает мою проблему, хотя ParseExact лучше всего подойдет, если известны форматы.
Мунавар
У вас все еще есть проблема, когда формат даты "12122019"
Атанасиос Катарас
6

Проверьте официальную документацию на ParseExact

Если вы знаете точное представление, вы можете сделать что-то вроде этого:

  format = "ddd dd MMM yyyy h:mm tt zzz";
  try {
     result = DateTime.ParseExact(dateString, format, provider);
     Console.WriteLine("{0} converts to {1}.", dateString, result.ToString());
  }
  catch (FormatException) {
     Console.WriteLine("{0} is not in the correct format.", dateString);
  }

Если вы этого не знаете, то вы застряли с культурными конвенциями

Разобрать строку даты и времени, используя условные обозначения определенной культуры. Перегрузка Parse (String, IFormatProvider) (см. Соглашения о синтаксическом и культурном анализе)

Атанасиос Катарас
источник
Формат не известен, он может быть любым на основе пользовательских предпочтений.
Мунавар
1
@Munawar, как вы будете различать между 1/3/2019 и 01.03.2009 в этой ситуации?
Блейз
@Athanasios, приложение используется для разных регионов и даты хранятся в зашифрованном виде. так как пользователь может изменить форматы даты, поэтому не стоит связываться с применением определенного формата, хотя ParseExact лучше всего подходит, если формат известен.
Мунавар