以下代码行返回 true(它不应该)......并将 1.0228 转换为日期时间......
DateTime.TryParse(1.0228,out temporaryDateTimeValue)
有人请帮助我。
以下代码行返回 true(它不应该)......并将 1.0228 转换为日期时间......
DateTime.TryParse(1.0228,out temporaryDateTimeValue)
这不会编译。
但是,如果你用引号括起来(并稍微清理一下),
bool success = DateTime.TryParse("1.0228", out temporaryDateTimeValue);
那么,是的,你会true
回来的。您需要阅读文档以了解原因,但基本上,格式化日期有很多不同的方法,您偶然发现了一种(也许M.yyyy
?)。
如果您不希望它解析,我可以建议
bool success = DateTime.TryParseExact(
"1.0228",
"yyyyMMdd",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out temporaryDateTimeValue
);
然后success
是false
。
我从文档中的注释中注意到:
该字符串
s
使用当前DateTimeFormatInfo
对象中的格式信息进行解析,该信息由当前线程区域性隐式提供。如果可能,此方法会尝试忽略无法识别的数据,并使用当前日期填充缺失的月、日和年信息。如果 s 仅包含日期而没有时间,则此方法假定时间为午夜 12:00。s 中的任何前导、内部或尾随空白字符都将被忽略。日期和时间可以用一对前导和尾随数字符号字符('#',U+0023)括起来,并且可以用一个或多个空字符(U+0000)尾随。
因为该
DateTime.TryParse(String, DateTime)
方法尝试string
使用当前文化的格式规则来解析日期和时间的表示,所以尝试跨不同文化解析特定的内容string
可能会失败或返回不同的结果。如果将跨不同的语言环境解析特定的日期和时间格式,请使用该DateTime.TryParse(String, IFormatProvider, DateTimeStyles, DateTime)
方法或该方法的重载之一TryParseExact
并提供格式说明符。
基本上,TryParse
“尝试”非常难以解析您给它的字符串(尽管“ Try
”实际上是指该方法返回一个用于成功/失败指示的布尔值)。
不,该代码不会返回 true - 它甚至不会编译:
using System;
class Program
{
static void Main(string[] args)
{
DateTime dt;
Console.WriteLine(DateTime.TryParse(1.0228, out dt));
}
}
错误:
Test.cs(9,27): error CS1502: The best overloaded method match for
'System.DateTime.TryParse(string, out System.DateTime)' has some invalid
arguments
Test.cs(9,45): error CS1503: Argument 1: cannot convert from 'double' to
'string'
如果将其更改为“1.0228”,它会返回 true,是的。看起来它使用的是“M.yyyy”格式,这无疑对某些文化有效……并强调了为什么DateTime.TryParse
在我看来使用它是一个坏主意。如果您有特定的格式(或格式集),则应DateTime.TryParseExact
改为使用,以便指定格式。
我通常发现指定确切的格式是个好主意,而且我通常也会指定CultureInfo.InvariantCulture
,除非日期直接来自用户(根据我的经验,这种情况很少见)。