【问题标题】:Crash occured when parsing datetime dd/MM/yyyy hh:mm:ss tt (having dynamic input)解析日期时间 dd/MM/yyyy hh:mm:ss tt(具有动态输入)时发生崩溃
【发布时间】:2016-04-29 03:58:57
【问题描述】:

我的代码在这里将String 解析为DateTime

DateTime datenew = DateTime.Parse("05/06/2015 17:18:12");
String convertDate = datenew .ToString("MM/dd/yyyy hh:mm:ss tt");

此解析会自动将时间16:13:12 转换为05:18:12 PM。 在我输入 dd/MM/yyyy 的格式之前,这一切都很顺利(顺便说一句,这与 hh:mm:ss tt 或 hh:mm:ss 无关。没关系)。它会引发异常。

例如我输入18/02/2015 17:18:12,现在它会抛出一个错误。

无论dd/MM/yyyyMM/dd/yyyy 格式如何,我都希望我的输入是动态的。我只想要MM/dd/yyyy hh:mm:ss tt 格式的标准输出。

有什么建议吗?

编辑。

Exception thrown: 
An unhandled exception of type 'System.FormatException' occurred in mscorlib.dll
Additional information: String was not recognized as a valid DateTime.

【问题讨论】:

  • 你能发布它抛出的异常消息吗?
  • 正如@GrantWinney 指出的那样,编写试图猜测日期格式的代码几乎总是一个坏主意。选择所需的格式并坚持下去。
  • @DmitryK。请参阅编辑后的帖子:)
  • @GrantWinney - 当我将输入更改为 18/02/2015 17:18:12 但 05/06/2015 17:18:12 工作正常时发生。问题是当我输入 18/02/2015 17:18:12 时。
  • @WhiteMark 是的,05/06 '工作正常',但它仍然可能是错误的。提供“18/02/2015”格式的人清楚地使用“dd/MM/yyyy” - 这意味着,如果他们向您发送“05/06/2015”,则表示 6 月 5 日,但你会读到 5 月 6 日。

标签: c# .net date datetime


【解决方案1】:

根据我的评论,您需要在尝试解析日期之前确定日期的格式。定义此格式的位置取决于您。

void Main()
{
    var format = GetFormat();
    var input = "05/06/2015 17:18:12";
    var parsedDate = DateTime.ParseExact(input, format, CultureInfo.InvariantCulture);
    var output = parsedDate.ToString("MM/dd/yyyy hh:mm:ss tt");
}

string GetFormat()
{
    //Take this from their user, client, file name, etc, etc.
    //Where this is configured doesn't really matter - but it needs to be somewhere.

    if (client.IsAmerican)
    {
        return "MM/dd/yyyy HH:mm:ss";
    } else {
        return "dd/MM/yyyy HH:mm:ss";
    }
}

【讨论】:

  • 好的。我现在明白你了。我想现在在同一边。但是如果我已经收到 05/06/2015 05:18:12 PM 的输入,我该如何处理?
  • @WhiteMark 没关系,只要您知道发件人使用的格式。如果你不知道格式,就不可能知道它是什么日期。你只能猜测。
  • 所以如果捕获另一个日期格式,我的程序可能会崩溃?啊!呵呵!感谢这个罗!很有帮助。
  • @WhiteMark 不用担心!是的 - 如果他们使用不同的格式,它会崩溃,但在我看来,最好是在错误数据上失败而不是默默地接受它(并且它是错误的):)
【解决方案2】:

我将在这里暗中尝试一下,并猜测它不起作用,因为它不知道日期应该采用什么格式。

查看前两个示例here,它们解释了如何设置文化或风格。

【讨论】:

  • 我认为 DateTime.Parse 只接受 MM/dd/yyyy 格式?如果输入是 dd/MM/yyyy,IDK 如何使用它。因为我需要用自定义格式解析 datetoString 。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 2020-03-07
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多