DateTime.TryParse只用于Time参数?

时间:2012-02-22 20:04:27

标签: c#

我正在编写一个在下午4点和凌晨5点调用方法的服务。我想保持这些时间不被硬编码,所以我想将它们放在我的appconfig中。

这是我的代码:

public bool CheckTime() 
        {
            DateTime startTime;
            DateTime endTime; 

            DateTime.TryParse(ConfigurationManager.AppSettings["ProcessingStartTime"], out startTime);
            DateTime.TryParse(ConfigurationManager.AppSettings["ProcessingEndTime"], out endTime);

            if(DateTime.Now.TimeOfDay.Equals(startTime) || DateTime.Now.TimeOfDay.Equals(endTime))
                return true;
            else
                return false;
        }

但是,因为我只想将时间存储为字符串(就像“下午4点”一样简单),如何在DateTime对象中解析和封装时间?还是有另一个对象?我不关心日期,它只需要是任何给定年份任何一周的M-F。

谢谢你们。

2 个答案:

答案 0 :(得分:9)

您可以将TryParseExact与适当的格式字符串一起使用,然后忽略该日期。 .NET中的“只是时间”没有很好的封装。但是,有一个替代方案 - 我一直在Noda Time努力工作,其中LocalTime类型就是为此目的:

// "Traditional" way
LocalTime time;
if (LocalTime.TryParseExact(text, "h:mmtt", out time))
{
    ...
}

// Preferred way

private static readonly LocalTimePattern TimePattern = 
    LocalTimePattern.CreateWithInvariantInfo("h:mmtt");
...

ParseResult<LocalTime> parseResult = TimePattern.Parse(text);
if (parseResult.Success)
{
    LocalTime time = parseResult.Value;
    ...
}

两个附注:

  • 忽略DateTime.TryParse(或任何其他TryParse方法的返回值)几乎永远是合适的 - 如果有的话,你真的想要使用DateTime.MinValue吗?数据有问题吗? 的情况下,默认值是合适的,但它们非常罕见
  • 请尽量避免使用以下格式的代码:

    if (condition)
        return true;
    else
        return false;
    

    这更明确地写为:

    return condition;
    

答案 1 :(得分:1)

我在尝试tryparse(甚至使用TryParseExact)时遇到了困难,所以我写了一个正则表达式:

Regex checkTime = new Regex(@"^(?i)(0?[1-9]|1[0-9]|2[0-4]):([0-5][0-9])(:[0-5][0-9])?( AM| PM)?$");

您可以通过以下方式验证自己的时间:

checkTime.IsMatch(str);

这将适用于以下格式(不区分大小写):

  • 08:09:00 AM
  • 08:09 AM
  • 上午8:30
  • 8:30:59

您可以here

检查它

希望这会有所帮助