我正在编写一个在下午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。
谢谢你们。
答案 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);
这将适用于以下格式(不区分大小写):
您可以here
检查它希望这会有所帮助