【问题标题】:How to validate if a "date and time" string only has a time?如何验证“日期和时间”字符串是否只有时间?
【发布时间】:2011-09-14 17:24:16
【问题描述】:

我有一个字符串变量,可以存储完整日期或部分日期:

1) 完整日期:12/12/2010 12:33 AM

2) 部分日期:12:33 AM(没有日期字段只有时间)

我正在尝试找出解析字符串以确定字符串是否缺少日期字符串的最佳方法。原因是,在我的代码中,如果缺少日期,我将在字符串中附加一个默认日期(例如 1/1/1900)。请记住,时间可能有多种格式。

更新 - 我对这个问题的特别回答。

正如所有“帖子”所说,这个问题有多种答案,这是我最终使用的,希望它可以帮助其他人*:

public DateTime ProcessDateAndTime(string dateString)
{
    string dateAndTimeString = dateString;

    string[] timeFormats = new string[]
    {
        "hh:mm tt", "hh:mm:ss tt",
        "h:mm tt", "h:mm:ss tt", 
        "HH:mm:ss", "HH:mm", "H:mm"
    };
    // check to see if the date string has a time only
    DateTime dateTimeTemp;
    if (DateTime.TryParseExact(dateString, timeFormats,
        CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.None, out dateTimeTemp))
    {
        // setting date to 01/01/1900
        dateAndTimeString = new DateTime(1900, 1, 1).ToShortDateString() + " " + dateString;
    }

    return DateTime.Parse(dateAndTimeString);
}

*注意:此方法基于以下假设,即您的应用程序中仅使用了特定数量的时间格式,并且保证传入格式正确的日期和时间或仅时间字符串(预验证删除垃圾文本)。

【问题讨论】:

  • 时间可以是各种格式,也可以是整个日期时间字符串?
  • 该用户是在新应用程序中输入的,还是数据挖掘/现有数据?如果它是一个新的应用程序,不要试图解决这个问题 - 让用户以正确的格式为您提供数据,并以特定格式记录您期望的数据。或者为他们提供 GUI 控件,为您提供正确的数据。
  • Matt - 时间可以采用多种格式,例如:12:55 AM、12:55:33。 Merlyn - 不幸的是,它使用现有数据,而不是基于用户输入。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# string parsing datetime time


【解决方案1】:

使用

Convert.ToDateTime(string value, IFormatProviderProvider provider)

由于字符串有不同的风格,请根据需要提供不同的格式提供程序。

顺序可以是:

  • 仅日期
  • 仅限时间
  • 日期时间

如果转换失败,将抛出格式异常。如果您不希望出现异常,请改用Datetime.TryParse,因为它会返回一个布尔值。

根据字符串的表示方式,您可以拥有超过 3 个格式提供程序。

【讨论】:

    【解决方案2】:

    您可以尝试使用正则表达式验证字符串, 顺便说一句,DateTime 验证的良好正则表达式可以在 here 找到。

    【讨论】:

      【解决方案3】:

      您可以使用DateTime.TryParseExact

      【讨论】:

        【解决方案4】:

        这可能不是最好的,但它回答了您的问题:

            string dateString = "9:53AM";
            if (!dateString.Contains('/')))
            {
                dateString = DateTime.Now.ToShortDateString() + " " + dateString;
            }
        

        【讨论】:

        • Convert.ToChar("/")?你为什么不写'/'
        • 每天学习新东西。我不知道你能做到。我改变了它。感谢您的提示。
        • 如果应用程序应该在世界的多个地区工作,这不是一个好主意,因为我们并不都使用'/'来分隔日期。例如,2010-12-12 是在欧洲部分地区编写日期的常用方式。
        • 对——我的回答可能失败的原因有很多,但它确实只是回答了这个问题。 Bob2Chiv 说时间可能有多种格式,但没有提到日期。我认为了解更多细节然后编写一些正则表达式可能是最好的方法。
        • @Matt,我想你可能指的是 OP:Hans Gruber
        【解决方案5】:

        查看字符串的长度将是直截了当的,并且将支持多种格式。带有日期和时间的字符串肯定会比只有时间的字符串长。但是,如果您的输入可能具有高精度(12:30:30:50:20 vs 12/11/11 12:30)和低精度的时间,这将不起作用。

        如果您不需要立即知道字符串中的值,而只想添加默认日期,则此解决方案非常理想。

        例如,如果您支持精确到秒的时间,则时间将包含 8 个或更少字符,而日期时间将包含 9 个或更多字符。

        【讨论】:

          【解决方案6】:

          这是在不知道所有可能的时间格式的情况下执行此操作的一种方法:

          CultureInfo provider = CultureInfo.CurrentCulture;
          DateTime time;
          DateTime datetime;
          bool isTime = DateTime.TryParse(dateString, provider, DateTimeStyles.NoCurrentDateDefault, out time) 
                      && time.Date == DateTime.MinValue.Date
                      && DateTime.TryParse(dateString, provider, DateTimeStyles.None, out datetime) 
                      && datetime.Date != DateTime.MinValue.Date);
          

          如果字符串只有时间,那么第一个 TryParse 会将日期部分设置为 1/1/0001 或 DateTime.MinValue.Date,第二个 TryParse 会将日期部分设置为当前日期。这将起作用,除非它由神秘博士在时光倒流到 0001 年 1 月 1 日后运行。

          【讨论】:

            【解决方案7】:

            考虑到时间可以采用各种格式(12/24?),最好以某种预定义的顺序使用多个模式,尝试解析每个模式并在第一个成功时解析。

            【讨论】:

              【解决方案8】:

              你也可以试试

              DateTime aTime;
              if (DateTime.TryParse(dateString, CultureInfo.InvariantCulture.DateTimeFormat, DateTimeStyles.NoCurrentDateDefault, out aTime))
              {
                  //if the there is no date part in the dateString, date will
                  // default to Gregorian 1/1/0001
              }
              

              【讨论】:

                猜你喜欢
                • 2020-03-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-08-23
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多