{"id":486,"date":"2011-08-27T21:19:23","date_gmt":"2011-08-27T19:19:23","guid":{"rendered":"http:\/\/hen.co.za\/blog\/?p=486"},"modified":"2011-08-27T21:19:23","modified_gmt":"2011-08-27T19:19:23","slug":"is-it-my-time-or-not","status":"publish","type":"post","link":"https:\/\/hen.co.za\/blog\/2011\/08\/is-it-my-time-or-not\/","title":{"rendered":"Is it my time or not?"},"content":{"rendered":"<p>Sounds like another philosophical question but no, you can relax. This is another developmental (yes almost mental) posting.<\/p>\n<p>Say you need to create a piece of functionality that must only operate within a predefined time period of a day &#8211; call it a &#8216;service window&#8217;. It could be that you may even need several of these &#8216;windows&#8217; per day &#8211; i.e. if there is a pause period inside the day and work must be processed before (up until) and after the pause.<\/p>\n<p>For this kind of functionality I created a &#8216;ServiceWindows&#8217; class. It basically host a list of &#8216;from&#8217; and &#8216;to&#8217; times plus methods that makes it possible to find out if a specified time is somewhere &#8216;inside&#8217; or &#8216;outside&#8217; any &#8216;service window&#8217;. Additionally the class can be &#8216;populated&#8217; from an xml config string so it can be used in applications that operates from xml config files.<\/p>\n<p>So without much further chit-chatting here is the guts of the class (not for sensitive readers \ud83d\ude09<\/p>\n<pre><span style=\"color: #0000ff;\">using\u00a0<\/span>System;\r\n<span style=\"color: #0000ff;\">using\u00a0<\/span>System.Collections.Generic;\r\n<span style=\"color: #0000ff;\">using\u00a0<\/span>System.Linq;\r\n<span style=\"color: #0000ff;\">using\u00a0<\/span>System.Text;\r\n<span style=\"color: #0000ff;\">using\u00a0<\/span>System.Xml;\r\n\r\n\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">public\u00a0class<\/span>\u00a0<span style=\"color: #0000ff;\">ServiceWindow<\/span>\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0ServiceWindow<\/span>(<span style=\"color: #0000ff;\">DateTime\u00a0<\/span>from,\u00a0<span style=\"color: #0000ff;\">DateTime\u00a0<\/span>to)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0From\u00a0=\u00a0from;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0To\u00a0=\u00a0to;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0DateTime<\/span>\u00a0From\u00a0{\u00a0get;\u00a0set;\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0DateTime<\/span>\u00a0To\u00a0{\u00a0get;\u00a0set;\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0class<\/span>\u00a0<span style=\"color: #0000ff;\">ServiceWindows<\/span>\r\n\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">private\u00a0List<\/span>&lt;<span style=\"color: #0000ff;\">ServiceWindow<\/span>&gt;\u00a0times\u00a0=\u00a0<span style=\"color: #0000ff;\">new\u00a0List<\/span>&lt;<span style=\"color: #0000ff;\">ServiceWindow<\/span>&gt;();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0List<\/span>&lt;<span style=\"color: #0000ff;\">ServiceWindow<\/span>&gt;\u00a0Times\u00a0{\u00a0<span style=\"color: #0000ff;\">get\u00a0<\/span>{\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>times;\u00a0}\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0void<\/span>\u00a0AddTimeWindow(<span style=\"color: #0000ff;\">DateTime\u00a0<\/span>fromTime,\u00a0<span style=\"color: #0000ff;\">DateTime\u00a0<\/span>toTime)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0times.Add(<span style=\"color: #0000ff;\">new\u00a0ServiceWindow<\/span>(fromTime,\u00a0toTime));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0bool<\/span>\u00a0IsInTimeWindow()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>IsInTimeWindow(<span style=\"color: #0000ff;\">DateTime<\/span>.Now);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0bool<\/span>\u00a0IsInTimeWindow(<span style=\"color: #0000ff;\">DateTime\u00a0<\/span>nowTime)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">if\u00a0<\/span>(times.Count\u00a0==\u00a00)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>true;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">else<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>(from\u00a0t\u00a0in\u00a0times\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0where\u00a0t.From.TimeOfDay\u00a0&lt;=\u00a0nowTime.TimeOfDay\u00a0&amp;&amp;\r\n                              t.To.TimeOfDay\u00a0&gt;=\u00a0nowTime.TimeOfDay\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0select\u00a0t).Count()\u00a0&gt;\u00a00;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0void<\/span>\u00a0CreateFromConfig(<span style=\"color: #0000ff;\">string\u00a0<\/span>config)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">if\u00a0<\/span>(config.Length\u00a0&gt;\u00a00)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0times.Clear();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">XmlDocument\u00a0<\/span>configXml\u00a0=\u00a0new\u00a0<span style=\"color: #0000ff;\">XmlDocument<\/span>();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0configXml.LoadXml(config);\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">XmlElement\u00a0<\/span>root\u00a0=\u00a0configXml.DocumentElement;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">foreach\u00a0<\/span>(<span style=\"color: #0000ff;\">XmlNode\u00a0<\/span>windowItem\u00a0<span style=\"color: #0000ff;\">in\u00a0<\/span>root.SelectNodes(\"window\"))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">try<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">DateTime\u00a0<\/span>fromTime\u00a0=\u00a0<span style=\"color: #0000ff;\">DateTime<\/span>.Parse(windowItem.ReadXmlElementAttr(\"from\",\u00a0\"00:00:01\"));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">DateTime\u00a0<\/span>toTime\u00a0=\u00a0<span style=\"color: #0000ff;\">DateTime<\/span>.Parse(windowItem.ReadXmlElementAttr(\"to\",\u00a0\"23:59:59\"));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0times.Add(new\u00a0<span style=\"color: #0000ff;\">ServiceWindow<\/span>(fromTime,\u00a0toTime));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">catch\u00a0<\/span>{\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0string<\/span>\u00a0ToConfig()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">StringBuilder\u00a0<\/span>sb\u00a0=\u00a0new\u00a0<span style=\"color: #0000ff;\">StringBuilder<\/span>();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sb.AppendLine(\"&lt;serviceWindows&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">if\u00a0<\/span>(times.Count\u00a0&gt;\u00a00)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">foreach\u00a0<\/span>(<span style=\"color: #0000ff;\">ServiceWindow\u00a0<\/span>timeWindow\u00a0<span style=\"color: #0000ff;\">in\u00a0<\/span>times)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sb.AppendLine(<span style=\"color: #0000ff;\">string<\/span>.Format(\"&lt;window\u00a0from=\\\"{0}\\\"\u00a0to=\\\"{1}\\\"\u00a0\/&gt;\",\r\n                              timeWindow.From.ToString(\"HH:mm:ss\"),\r\n                              timeWindow.To.ToString(\"HH:mm:ss\")));\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sb.AppendLine(\"&lt;\/serviceWindows&gt;\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>sb.ToString();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">public\u00a0override\u00a0string<\/span>\u00a0ToString()\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">StringBuilder\u00a0<\/span>sb\u00a0=\u00a0new\u00a0<span style=\"color: #0000ff;\">StringBuilder<\/span>();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">if\u00a0<\/span>(times.Count\u00a0&gt;\u00a00)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">foreach\u00a0<\/span>(<span style=\"color: #0000ff;\">ServiceWindow\u00a0<\/span>timeWindow\u00a0<span style=\"color: #0000ff;\">in\u00a0<\/span>times)\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sb.Append(<span style=\"color: #0000ff;\">string<\/span>.Format(\"{0}\u00a0to\u00a0{1}\u00a0and\u00a0\",\r\n                           timeWindow.From.ToString(\"HH:mm:ss\"),\r\n                           timeWindow.To.ToString(\"HH:mm:ss\")));\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">else<\/span>\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0sb.Append(\"None\");\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<span style=\"color: #0000ff;\">return\u00a0<\/span>sb.ToString().Trim('\u00a0',\u00a0'a',\u00a0'n',\u00a0'd');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\r\n\u00a0\u00a0\u00a0\u00a0}<\/pre>\n<p>I noticed that I included an XmlNode extension method (ReadXmlElementAttr) that I defined elsewhere but all it does is to read an xml element attribute or provide a default value if not found. I&#8217;ll list that class here on my blog too soon.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sounds like another philosophical question but no, you can relax. This is another developmental (yes almost mental) posting. Say you need to create a piece of functionality that must only operate within a predefined time period of a day &#8211; &hellip;<\/p>\n<p class=\"read-more\"><a href=\"https:\/\/hen.co.za\/blog\/2011\/08\/is-it-my-time-or-not\/\">Read more &raquo;<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[7,8,9,303],"class_list":["post-486","post","type-post","status-publish","format-standard","hentry","category-development","tag-net","tag-c","tag-code","tag-development"],"_links":{"self":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts\/486","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/comments?post=486"}],"version-history":[{"count":3,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts\/486\/revisions"}],"predecessor-version":[{"id":489,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/posts\/486\/revisions\/489"}],"wp:attachment":[{"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/media?parent=486"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/categories?post=486"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hen.co.za\/blog\/wp-json\/wp\/v2\/tags?post=486"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}