using System.Globalization;
using System.Collections.Generic;
public static void Main()
var start = DateTime.ParseExact("1600-02-05 02:55:51", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
var end = DateTime.ParseExact("2016-02-29 22:55:51", "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
GetDocumentsInRange(start, end);
public static void GetDocumentsInRange(DateTime st, DateTime en)
Console.WriteLine("start:"+st+ "\nend:"+en);
foreach (var prefix in GetAllPrefix( st, en))
Console.WriteLine(GetDocumentsPrefix(prefix));
public static string GetDocumentsPrefix(string prefix)
return "GetDocuments called for prefix: " + prefix;
internal static IEnumerable<string> GetAllPrefix(DateTime st, DateTime en)
var start = new MyDateTime(st);
var end = new MyDateTime(en);
List<string> prefixes = new List<string>();
var nextStart = GetPrefix(start, end, out prefix);
if(IsValidPrefix(prefix)) yield return prefix.TrimEnd('*');
while (string.Compare(nextStart.ToString(), end.ToString()) <= 0)
nextStart = GetPrefix(nextStart, end, out prefix);
if (IsValidPrefix(prefix)) yield return prefix.TrimEnd('*');
private static bool IsValidPrefix(string prefix)
return !(prefix.EndsWith("00********") || prefix.EndsWith("00******"));
internal static MyDateTime GetPrefix(MyDateTime start, MyDateTime end, out string prefix)
var startString = start.ToString();
var numTrailZeroes = CountTrailingZeroes(startString);
int pos = numTrailZeroes;
MyDateTime nextStart = end;
nextStart = Increment(start, pos);
if (string.Compare(nextStart.ToString(), end.ToString()) <= 0)
prefix = ReplaceSuffix(startString, pos);
private static int CountTrailingZeroes(string input)
return input.Reverse().TakeWhile(c => c == '0').Count();
internal static MyDateTime Increment(MyDateTime moment, int pos)
return moment.AddSeconds(1);
return moment.AddSeconds(10);
return moment.AddMinutes(1);
return moment.AddMinutes(10);
return moment.AddHours(1);
return moment.AddHours(10);
return moment.AddDays(1);
return moment.AddDays(10);
return moment.AddMonths(1);
return moment.AddMonths(10);
return moment.AddYears(1);
return moment.AddYears(10);
return moment.AddYears(100);
return moment.AddYears(1000);
throw new ArgumentException("pos not supported:" + pos);
private static string ReplaceSuffix(string input, int endPos)
var prefix = input.Substring(0, input.Length - endPos);
var suffix = string.Concat(Enumerable.Repeat('*', endPos));
internal class MyDateTime
public MyDateTime(int y, int mon, int d, int h, int min, int s)
public MyDateTime(DateTime dt)
public MyDateTime(MyDateTime dt)
public MyDateTime AddSeconds(int sec)
var temp = new MyDateTime(this);
temp.Second = temp.Second + sec;
temp.Second = temp.Second % 60;
return temp.AddMinutes(1);
public MyDateTime AddMinutes(int min)
var temp = new MyDateTime(this);
public MyDateTime AddHours(int hour)
var temp = new MyDateTime(this);
public MyDateTime AddDays(int day)
var temp = new MyDateTime(this);
if (temp.Day > DateTime.DaysInMonth(temp.Year, temp.Month))
return temp.AddMonths(1);
public MyDateTime AddMonths(int mon)
var temp = new MyDateTime(this);
public MyDateTime AddYears(int y)
var temp = new MyDateTime(this);
public override string ToString()
string value= string.Format("{0:0000}{1:00}{2:00}{3:00}{4:00}{5:00}",Year,Month,Day,Hour,Minute,Second);
{ throw new Exception("My datestring is invalid:"+ value);}