using System;
using System.Text;
using System.Text.RegularExpressions;
struct MyDate
{
public int? Year, Month, Day, Hour, Minute;
private static readonly Regex dtRegex = new Regex(
@"^(?<year>\d{4})?-(?<month>\d\d)?-(?<day>\d\d)?"
+ @"(?:T(?<hour>\d\d)?:(?<minute>\d\d)?)?$",
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
public static bool TryParse(string input, out MyDate result)
{
Match match = dtRegex.Match(input);
result = default(MyDate);
if (match.Success)
{
if (match.Groups["year"].Success)
result.Year = Int32.Parse(match.Groups["year"].Value);
if (match.Groups["month"].Success)
result.Month = Int32.Parse(match.Groups["month"].Value);
if (match.Groups["day"].Success)
result.Day = Int32.Parse(match.Groups["day"].Value);
if (match.Groups["hour"].Success)
result.Hour = Int32.Parse(match.Groups["hour"].Value);
if (match.Groups["minute"].Success)
result.Minute = Int32.Parse(match.Groups["minute"].Value);
}
return match.Success;
}
public static MyDate Parse(string input)
{
MyDate result;
if (!TryParse(input, out result))
throw new ArgumentException(string.Format("Unable to parse MyDate: '{0}'", input));
return result;
}
public override string ToString()
{
return string.Format("{0:0000}-{1:00}-{2:00}T{3:00}:{4:00}", Year, Month, Day, Hour, Minute);
}
public static implicit operator MyDate(string input)
{
return Parse(input);
}
}
class Program
{
static void Main(string[] args)
{
foreach (var testcase in new [] {
"2011-11-07T11:17",
"-11-07T11:17",
"2011--07T11:17",
"2011-11-T11:17",
"2011-11-07T:17",
"2011-11-07T11:",
// extra:
"--T11:17", // (11:17 am, no date, only time)
"-11-07", // (november the 7th, no year, no time)
// failures:
"2011/11/07 T 11:17",
"no match" })
{
MyDate parsed;
if (MyDate.TryParse(testcase, out parsed))
Console.WriteLine("'{0}' -> Parsed into '{1}'", testcase, parsed);
else
Console.WriteLine("'{0}' -> Parse failure", testcase);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uVGV4dDsKdXNpbmcgU3lzdGVtLlRleHQuUmVndWxhckV4cHJlc3Npb25zOwoKc3RydWN0IE15RGF0ZSAKeyAKCXB1YmxpYyBpbnQ/IFllYXIsIE1vbnRoLCBEYXksIEhvdXIsIE1pbnV0ZTsgCgoJcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUmVnZXggZHRSZWdleCA9IG5ldyBSZWdleCgKCQlAIl4oPzx5ZWFyPlxkezR9KT8tKD88bW9udGg+XGRcZCk/LSg/PGRheT5cZFxkKT8iCgkrICAgQCIoPzpUKD88aG91cj5cZFxkKT86KD88bWludXRlPlxkXGQpPyk/JCIsCgkJUmVnZXhPcHRpb25zLkNvbXBpbGVkIHwgUmVnZXhPcHRpb25zLklnbm9yZUNhc2UgfCBSZWdleE9wdGlvbnMuQ3VsdHVyZUludmFyaWFudCk7CgoJcHVibGljIHN0YXRpYyBib29sIFRyeVBhcnNlKHN0cmluZyBpbnB1dCwgb3V0IE15RGF0ZSByZXN1bHQpCgl7CgkJTWF0Y2ggbWF0Y2ggPSBkdFJlZ2V4Lk1hdGNoKGlucHV0KTsKCQlyZXN1bHQgPSBkZWZhdWx0KE15RGF0ZSk7CgoJCWlmIChtYXRjaC5TdWNjZXNzKQoJCXsKCQkJaWYgKG1hdGNoLkdyb3Vwc1sieWVhciJdLlN1Y2Nlc3MpCgkJCQlyZXN1bHQuWWVhciA9IEludDMyLlBhcnNlKG1hdGNoLkdyb3Vwc1sieWVhciJdLlZhbHVlKTsKCQkJaWYgKG1hdGNoLkdyb3Vwc1sibW9udGgiXS5TdWNjZXNzKQoJCQkJcmVzdWx0Lk1vbnRoID0gSW50MzIuUGFyc2UobWF0Y2guR3JvdXBzWyJtb250aCJdLlZhbHVlKTsKCQkJaWYgKG1hdGNoLkdyb3Vwc1siZGF5Il0uU3VjY2VzcykKCQkJCXJlc3VsdC5EYXkgPSBJbnQzMi5QYXJzZShtYXRjaC5Hcm91cHNbImRheSJdLlZhbHVlKTsKCQkJaWYgKG1hdGNoLkdyb3Vwc1siaG91ciJdLlN1Y2Nlc3MpCgkJCQlyZXN1bHQuSG91ciA9IEludDMyLlBhcnNlKG1hdGNoLkdyb3Vwc1siaG91ciJdLlZhbHVlKTsKCQkJaWYgKG1hdGNoLkdyb3Vwc1sibWludXRlIl0uU3VjY2VzcykKCQkJCXJlc3VsdC5NaW51dGUgPSBJbnQzMi5QYXJzZShtYXRjaC5Hcm91cHNbIm1pbnV0ZSJdLlZhbHVlKTsKCQl9CgoJCXJldHVybiBtYXRjaC5TdWNjZXNzOwoJfQoKCXB1YmxpYyBzdGF0aWMgTXlEYXRlIFBhcnNlKHN0cmluZyBpbnB1dCkKCXsKCQlNeURhdGUgcmVzdWx0OwoJCWlmICghVHJ5UGFyc2UoaW5wdXQsIG91dCByZXN1bHQpKQoJCQl0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oc3RyaW5nLkZvcm1hdCgiVW5hYmxlIHRvIHBhcnNlIE15RGF0ZTogJ3swfSciLCBpbnB1dCkpOwoKCQlyZXR1cm4gcmVzdWx0OwoJfQoKCXB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQoJewoJCXJldHVybiBzdHJpbmcuRm9ybWF0KCJ7MDowMDAwfS17MTowMH0tezI6MDB9VHszOjAwfTp7NDowMH0iLCBZZWFyLCBNb250aCwgRGF5LCBIb3VyLCBNaW51dGUpOwoJfQoKCXB1YmxpYyBzdGF0aWMgaW1wbGljaXQgb3BlcmF0b3IgTXlEYXRlKHN0cmluZyBpbnB1dCkKCXsKCQlyZXR1cm4gUGFyc2UoaW5wdXQpOwoJfQp9CgpjbGFzcyBQcm9ncmFtCnsKICAgIHN0YXRpYyB2b2lkIE1haW4oc3RyaW5nW10gYXJncykKICAgIHsKCQlmb3JlYWNoICh2YXIgdGVzdGNhc2UgaW4gbmV3IFtdIHsgCgkJCQkiMjAxMS0xMS0wN1QxMToxNyIsCgkJCQkiLTExLTA3VDExOjE3IiwKCQkJCSIyMDExLS0wN1QxMToxNyIsCgkJCQkiMjAxMS0xMS1UMTE6MTciLAoJCQkJIjIwMTEtMTEtMDdUOjE3IiwKCQkJCSIyMDExLTExLTA3VDExOiIsCgkJCQkvLyBleHRyYToKCQkJCSItLVQxMToxNyIsIC8vICgxMToxNyBhbSwgbm8gZGF0ZSwgb25seSB0aW1lKQoJCQkJIi0xMS0wNyIsIC8vIChub3ZlbWJlciB0aGUgN3RoLCBubyB5ZWFyLCBubyB0aW1lKQoJCQkJLy8gZmFpbHVyZXM6CgkJCQkiMjAxMS8xMS8wNyBUIDExOjE3IiwKCQkJCSJubyBtYXRjaCIgfSkKCQl7CgkJCU15RGF0ZSBwYXJzZWQ7CgkJCWlmIChNeURhdGUuVHJ5UGFyc2UodGVzdGNhc2UsIG91dCBwYXJzZWQpKQoJCQkJQ29uc29sZS5Xcml0ZUxpbmUoIid7MH0nIC0+IFBhcnNlZCBpbnRvICd7MX0nIiwgdGVzdGNhc2UsIHBhcnNlZCk7CgkJCWVsc2UKCQkJCUNvbnNvbGUuV3JpdGVMaW5lKCInezB9JyAtPiBQYXJzZSBmYWlsdXJlIiwgdGVzdGNhc2UpOwoJCX0KCX0KfQogCg==