Десяткові значення, визнані DateTime, замість повернення помилкових з 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. Це не те, про що ви просили?
Руфус L

2
@Munawar - "3,5 - дійсна дата та дійсна десяткова" точно. Якщо нам, як людям, подано цей рядок і жоден інший контекст, ми не знаємо, чи мав він бути дата, десятковий чи можливий щось інше . Ви не можете очікувати, що комп'ютер магічно отримає відповідь на нього.
Damien_The_Unbeliever

Так, ця відповідь стосується конкретного питання і вирішує мою проблему, хоча ParseExact найкраще підійде, якщо відомі формати.
Монавар

У вас є проблема, коли формат дати "12122019"
Athanasios Kataras

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);
  }

Якщо ви цього не знаєте, то ви застрягли в культурних конвенціях

Розбирайте рядок дати та часу за допомогою конвенцій певної культури. Перевантаження (String, IFormatProvider) перевантаження (див. Розбір і культурні конвенції)


Формат не відомий, він може бути будь-яким на основі переваг користувача.
Мунавар

1
@Munawar, як ви будете відрізняти 3/3/2019/1/3/2019 у цій ситуації?
Блез

@Athanasios, додаток використовується для різних регіонів, а дати зберігаються зашифрованими. оскільки користувач може змінити формати дат, тому не хоче возитися із застосуванням конкретного формату, хоча ParseExact найкраще підходить, якщо відомий формат.
Мунавар
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.