views:

47

answers:

3

Hi

I'm writing a C# class that will convert strings to dates. Pretty easy I guess. The class accepts formatstrings like "yyyy-MM-dd" and inputstrings like "2010-10-10"

However I have some cases that give me trouble:

format "yyyyMMdd" input "19950000"

or

format "dd-MM-yyyy" input "00-06-2001"

Note that these cases have zeroes ('00') for day and/or month, and that these cannot be converted to a DateTime. I'll need to replace them.

To handle theses cases I need to split the input string in the parts, one each for day, month and year, so I can set some default day and month (probably 01) if they are missing. But I need to use the formatstring to accomplish this.

So the question is, how can I split an inputstring in the components specified in the formatstring?

Thanks

[UPDATE] Using Joe's answer I came up with this:

string[] formats = { format, format.Replace("dd", "00").Replace("MM", "00"), format.Replace("dd", "00"), format.Replace("MM", "00") };

// Parse input
DateTime d = DateTime.ParseExact(txtDate.Text, formats, CultureInfo.InvariantCulture, DateTimeStyles.None);

This uses the supplied format and creates alternative formats with zeroes ('00') for day, month and both day and month.

Thanks Joe!

+3  A: 

My approach would be to define various Regular Expressions and using a chain of responsibility design pattern, pass the value to the first, if matches it stops there and if not sends to the next one until one of them matches the string.

My regex pattern would separate date, month and year element and set a default value for each if it is 0.

Here for Chain-of-responsibility_pattern: http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern

private const string Pattern_dd-mm-yyyy = "(\d\d)-(\d\d)-(\d){4}";
private const string Pattern_ddmmyyyy = "(\d\d)(\d\d)(\d){4}";
private const string Pattern_ddSlashmmSlashyyyy = "(\d\d)/(\d\d)/(\d){4}";
Aliostad
Ok sounds good. The convertor class accepts as input a formatstring like 'dd-MM-yyyy', with many variations, so I'll need to construct the regex from this format string.
edosoft
Glad you liked it. Let me know how it goes.
Aliostad
+1  A: 

Hello, I don't fully understand your problem (I don't have the rep for a comment) but I can still give you some advices.

First of all, the DateTime class provides a ParseExact method (http://msdn.microsoft.com/en-us/library/w2sa9yss(v=VS.80).aspx) which accepts a formatting string for date and time. You can pass your format string to it

I don't clearly understand the part about the cases: do you need to accept timestamps in multiple formats? If so, you can try/catch until you find a match, or loop using the TryParseExact method which almost works the same.

Once you have a DateTime value, use the Year, Month and Day properties to get the components you've been searching in the input string

djechelon
ParseExact will throw exception and is no good.
Aliostad
I know about ParseExact. I have a convertor which accepts multiple formats. Its the '00' in the day and/or month part that are tripping me up.
edosoft
Now I understand you problem. But the question comes immediately: what's the sense of 00 in day/month? Anyway if you **only** support the two formats mentioned above, the Regex approach works fine. If you, instead, want to support yyyyMMdd **and**, for example, ddMMyyyy, there is no viable solution in my opinion
djechelon
+3  A: 

If you have a well-defined set of formats, you can use DateTime.ParseExact, passing an array of format strings.

// Define all allowed formats
string[] formats =  { "yyyyMMdd", "yyyyMM00", "yyyy0000" };

// Parse input
DateTime d;
d = DateTime.ParseExact("20100930", formats, 
                 CultureInfo.InvariantCulture, DateTimeStyles.None);
d = DateTime.ParseExact("20100900", formats, 
                 CultureInfo.InvariantCulture, DateTimeStyles.None);
d = DateTime.ParseExact("20100000", formats, 
                 CultureInfo.InvariantCulture, DateTimeStyles.None);

Missing days / months will be set to a default of 1.

Joe
Cool I didn't know that. This works for me.
edosoft