日期时间格式异常错误

3
DateTime datuMDokumenta = Convert.ToDateTime(txtDatumDokum.Text);

txtDatumDokum.Text类似于“09.09.2011”。

但我收到FormatException错误。我必须解析日期吗?


我在dotNet4.0中没有遇到任何异常。 - ARZ
请尝试检查您是否没有传递NULL或空字符串; - Alexander Beletsky
9个回答

3
尝试使用dd.MM.yyyy格式字符串来执行DateTime.ParseExact。
 DateTime.ParseExact(txtDatumDokum.Text, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None);

谢谢,这对我有用。所以即使日期格式正确,我也必须始终使用DateTime.ParseExact。 - senzacionale
@senzacionale,如果你只会收到一种特定格式的日期,那么不一定非要使用ParseExact,但建议这样做。 - Rune FS
尝试使用适合您所在地区的正确文化或de-DE(如果您不确定),这样就可以很好地工作,而无需使用ParseExact,请参见我的答案。 - crlanglois

1

看起来不太好,不过试试这个:

string s = "09.09.2011";
DateTime dt = Convert.ToDateTime(
    s.Replace(".",
    new System.Globalization.DateTimeFormatInfo().DateSeparator));

0
你可以尝试这个,TryParse避免了解析异常。然后你只需要检查结果以确保它已被解析。
DateTime datuMDokumenta;
bool result = DateTime.TryParse(txtDatumDokum.Text, out datuMDokumenta);

您需要确定这是否是您的应用程序的好解决方案。

请参考以下示例: http://msdn.microsoft.com/en-us/library/ch92fbc1.aspx

根据您提供的日期,您需要包含一个区域设置。de-DE接受01.01.11类型的日期,但我不确定您实际想要使用哪个日期格式,您需要自行决定。代码如下:

using System.Globalization;

DateTime datuMDokumenta;
bool result = DateTime.TryParse(txtDatumDokum.Text, CultureInfo.CreateSpecificCulture("de-DE"), DateTimeStyles.None, out datuMDokumenta);

这里可以找到文化列表,选择适合自己的: http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.71%29.aspx

优点在于,这段代码需要更多的工作,但是很难被破坏。假设您正在使用TextBox上的自由文本输入,您不想抛出异常。


0

是的,您必须在当前文化中解析输入日期。

string[] format = new string[] { "dd.MM.yyyy" };
string value = "09.09.2011";
DateTime datetime;

if (DateTime.TryParseExact(value, format, System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.NoCurrentDateDefault, out datetime))
      //Valid
else
     //Invalid

0

在紧凑框架3.5下进行反序列化调用时,我遇到了一些意外的行为。

我已经从使用OpenNETCF序列化类转换为使用框架XML序列化类。在这样做时,默认的时间格式已更改以及属性/公共成员的顺序。长话短说,我公开了一个文本属性,将我的日期时间转换回VB6应用程序所期望的格式。

            Dim dumbDate As New Date
            Dim formats() As String = {"yyyy-MM-ddTHH:mm:ss.fffzzz", _
                                       "yyyy-MM-dd HH:mm:ss:fffffffzzz"}

            _datetimeTaken = dumbDate.ParseExact(value, formats, CultureInfo.InvariantCulture, DateTimeStyles.None)

            ' There is something wrong with compact framework during the Serialization calls. 
            ' calling the shared method Date.Parse or Date.ParseExact does not produce the same
            ' result as calling a share method on an instance of Date. WTF?!?!?!
            ' The below will cause a "Format" exception.
            '_datetimeTaken = Date.ParseExact(value, formats, CultureInfo.InvariantCulture, DateTimeStyles.None)

Date.blah不起作用。dumbDate.blah可以工作。奇怪。


0

您需要告诉我们为什么文本输入使用这种格式。如果是因为用户以这种方式输入,那么您需要确保格式与 Thread.CurrentCulture.DateTimeFormat.ShortDatePattern 给出的格式相匹配。通过设置 Thread.CurrentCulture 为适当的值来更改区域设置,然后解决您的问题。

如果您需要解析输入,无论其格式如何,那么您需要先进行一些手动处理(例如使用 string.Replace 删除输入中的空格和其他分隔符字符),然后使用 DateTime.ParseExact 和已知的格式字符串尝试解析日期。

但这都取决于输入为什么具有该格式,以及您的应用程序当前的区域设置为什么不匹配它。


因为我使用了date.ToString("dd.MM.yyyy")。如果我使用ToShortDateString,那么我会得到09/08/2011,这是不正确的。我们的日期必须像08.09.2011这样。 - senzacionale
@senzacionale:如果问题涉及 CF 3.5,请标记为相应标签。 - Jon

0

DateTime dt = Convert.ToDateTime(txtDatumDokum.Text)

没问题,一切正常。


0
    public static void Main(string[] args)
    {
        var dt = new DateTime(2018, 04, 1);
        Console.WriteLine(dt);
       
        string month = dt.ToString("MMMM");
        Console.WriteLine(month);               //April

        month = dt.ToString("MMM");
        Console.WriteLine(month);              //Apr

        month = dt.ToString("MM");
        Console.WriteLine(month);             //04

        Console.ReadKey();
    }

-3

你的代码:

DateTime datuMDokumenta = Convert.ToDateTime(txtDatumDokum.Text);

尝试将其更改为:

DateTime datuMDokumenta = Convert.ToDateTime(txtDatumDokum);

当您打印日期/时间

打印datuMDokumenta.Text


你确定 ConvertToDateTime() 函数接受一个文本框作为参数吗? - Marco
它会抛出一个错误。如果没有扩展,你不能使用文本框。 - ankush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接