识别为DateTime的十进制值,而不是从DateTime.Parse返回false


9

我需要根据字符串值执行检查,无论它是日期还是十进制,但日期解析始终为十进制返回true。

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

它返回一个有效日期3/5/2019

当日期格式未知时,如何验证字符串以知道其有效日期?


6
首先检查十进制?或者,DateTime.ParseExact如果您知道它可以/应该采用哪种格式,请使用
一位朋友

3
您可以使用TryParseExact和指定有效的日期格式。
juharr

5
确实- DateTime.Parse尝试多种模式。如果只想识别特定的,请尝试专门分析它们。
乔恩·斯基特

1
这回答了你的问题了吗?使用DateTime.TryParse
Joost K

Answers:


3

“如何验证字符串以知道其有效日期?”

问题是,这"3.5" 认为是有效日期(也是十进制)。

如果你想十进制类型总是“赢”(即你不想isDateisDecimal对两者true),包括在验证小数检查。

一种方法是使用TryParse方法(bool如果可以将字符串解析为该类型,则返回a ,并将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是有效日期和有效十进制,因此,它根本没有帮助。
Munawar,

1
在上面的代码中,isDatefalse因为它包含对的检查isDecimal。那不是你要的吗?
Rufus L

2
@Munawar-“ 3.5是有效日期和有效十进制”。如果我们作为人类出现在该字符串中而没有其他上下文,那么我们不知道它是要用作日期,十进制还是其他可能的东西。您不能指望计算机能够神奇地得到答案。
Damien_The_Unbeliever

是的,此答案是特定于此问题的,并且可以解决我的问题,尽管如果已知格式,ParseExact最适合。
Munawar,

当日期格式为“ 12122019”时,您仍会遇到问题
Athanasios Kataras 19/12/18

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)重载(请参阅解析和文化约定)


格式未知,根据用户偏好可以是任何格式。
Munawar

1
@Munawar在这种情况下如何区分1/3/2019和3/1/2019?
布莱斯

@Athanasios,应用程序用于不同的区域和加密存储的日期。因为,用户可以更改日期格式,所以不想弄乱应用特定格式,尽管如果知道格式,ParseExact最适合。
Munawar,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.