【问题标题】:How to define DateTime parse format for general date format with optional time part?如何为具有可选时间部分的一般日期格式定义 DateTime 解析格式?
【发布时间】:2014-11-25 18:29:43
【问题描述】:

什么是正确的DateTime 格式以从一般日期格式("G") 和可选时间部分("d") 的字符串中解析日期?

我可以有两种日期:

  1. "12/13/2012 6:30:00 PM"
  2. "3/29/2013"

如何统一解析? 现在我正在尝试用"G" 格式解析,然后如果它没有用"d" 格式解析。

【问题讨论】:

  • 你的CurrentCulture是什么?

标签: c# .net datetime datetime-format


【解决方案1】:

只需使用DateTime.Parse() 或者如果您想进行安全解析尝试DateTime.TryParse()

DateTime dt1, dt2;
dt1 = DateTime.Parse("12/13/2012 6:30:00 PM");
dt2 = DateTime.Parse("3/29/2013");

DateTime.TryParse("12/13/2012 6:30:00 PM", out dt1);
DateTime.TryParse("3/29/2013", out dt2);

您只需使用DateTime.ParseExact() 或提供与DateTime.Parse() 接受的格式不同的格式,或者您只允许一种特定格式。

【讨论】:

  • 两次尝试解析 - 这是一项简单的任务。没有办法在一个解析请求中完成?
  • @DreamTeamMobile:“一个解析请求”到底是什么意思?一个明显的简化是创建一个包含两个 TryParse() 调用的小方法。另一种可能性是一组链式“if”语句。
  • 你只需要一行。将您的字符串分配给一个变量并使用 DateTime.Parse,我只是表明这两种格式都适用于 DateTime.Parse
【解决方案2】:

如果您的CurrentCulture 支持MM/dd/yyyy h:mm:ss tt(我假设您的LongTimePattern 具有h)和M/dd/yyyy(我假设您的ShortDatePattern 具有M)作为标准日期和时间格式,使用@987654324 @可以解决你所有的问题。

string s = "";
DateTime dt;
if (DateTime.TryParse(s, out dt))
{
    // Your string parsed successfully.
}

如果这些格式不是您的CurrentCulture 的标准日期和时间格式,则使用DateTime.TryParseExact(String, String[], IFormatProvider, DateTimeStyles, DateTime) overload 可能是最佳选择,因为它将格式部分作为字符串数组。这意味着,您可以提供多种格式,并且您的字符串将在第一次成功匹配时被解析。

string s = "";
string[] formats = { "MM/dd/yyyy h:mm:ss tt", "M/dd/yyyy" };
DateTime dt;
if (DateTime.TryParseExact(s, formats, CultureInfo.CurrentCulture,
                           DateTimeStyles.None, out dt))
{
    // Your string parsed with one of speficied format.
}

解析具有"/" custom format specifier 的字符串时要小心。它具有用当前文化或指定文化日期分隔符替换我的特殊含义。这意味着如果您的CurrentCultureDateSeparator property 不是/,那么即使您的字符串和格式是相同的格式,您的解析操作也会失败甚至

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多