DateTime.TryParse将decimal转换为datetime

时间:2011-06-28 18:32:57

标签: c# datetime tryparse

以下代码行返回true(它不应该)....并将1.0228转换为datetime ...

DateTime.TryParse(1.0228,out temporaryDateTimeValue)

有人请帮助我。

2 个答案:

答案 0 :(得分:9)

  

以下代码行返回true(它不应该)....并将1.0228转换为datetime ...

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

然后successfalse

我从documentation

的评论中注意到
  

使用当前线程文化隐式提供的当前s对象中的格式信息解析字符串DateTimeFormatInfo

     

如果可能,此方法会尝试忽略无法识别的数据,并使用当前日期填写缺少的月,日和年信息。如果s只包含日期而没有时间,则此方法假定时间是午夜12:00。 s中的任何前导,内部或尾随空格字符都将被忽略。日期和时间可以用一对前导和尾随的NUMBER SIGN字符('#',U + 0023)括起来,并且可以用一个或多个NULL字符(U + 0000)跟踪。

     

由于DateTime.TryParse(String, DateTime)方法尝试使用当前文化的格式规则解析日期和时间的string表示,因此尝试解析不同文化中的特定string可以失败或返回不同的结果。如果将跨不同的语言环境解析特定的日期和时间格式,请使用DateTime.TryParse(String, IFormatProvider, DateTimeStyles, DateTime)方法或TryParseExact方法的重载之一,并提供格式说明符。

基本上,TryParse“尝试”非常难以解析你给它的字符串(尽管“Try”实际上指的是该方法返回bool表示成功/失败指示)。

答案 1 :(得分:4)

不,该代码不会返回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,除非日期直接来自用户(根据我的经验,这很少见) )。