Zo Has
Zo Has

Reputation: 13018

Convert dd/MM/yyyy to yyyy/MM/dd?

I want to convert a string '30/12/2012' to '2012/12/30'. My application is set to "en-CA" however the database accepts yyyy/MM/dd as default.

How can I do this without depending on the current culture info set at server?

Upvotes: 4

Views: 12610

Answers (6)

dan_l
dan_l

Reputation: 1692

This seems to work.

        var x = new string[] { "2012/06/12", "20/06/2012", "111/111/1111" };
        foreach (var ds in x)
        {
            DateTime d = default(DateTime);
            try
            {
                d = DateTime.Parse(ds, CultureInfo.GetCultureInfo("en-CA"));
            }
            catch (Exception ex)
            {
                try
                {
                    d = DateTime.ParseExact(ds, "yyyy/MM/dd", CultureInfo.InvariantCulture);
                }
                catch
                {
                }
            }
            if (d == default(DateTime))
                Console.WriteLine("error");
            else
                Console.WriteLine(d.ToString());
        }

Upvotes: 1

Jon Skeet
Jon Skeet

Reputation: 1499760

As all the comments have said, but none of the answers have said so far: don't pass this to the database as a string.

Parse any text you receive as early as possible, then use DateTime to represent it everywhere else, including how you send it to the database, via parameterized SQL1. This goes for values of all kinds: convert it into the "natural" type for the data as soon as possible, and keep it in that natural representation for as long as possible. A date isn't a string, and you should only convert it to a string if you really, really need to - ideally just before displaying it to a user.

The parsing can be done with DateTime.ParseExact or DateTime.TryParseExact depending on whether this is "suspicious" data (e.g. from a user) or data which should really be correct and for which an exception is the most appropriate reaction to unparseable values. I suggest you pass in CultureInfo.InvariantCulture with your custom format string. For example:

DateTime date = DateTime.ParseExact(text, "dd/MM/yyyy",
                                    CultureInfo.InvariantCulture);

(If you do a lot of date/time work, you may also want to consider using my Noda Time project which allows you to express the value in a richer way - in this case you'd probably use LocalDate.)


1 If you're not already using parameterized SQL, but are instead baking values directly into the SQL, you have bigger problems than date/time conversions.

Upvotes: 13

astro boy
astro boy

Reputation: 1430

If its going to always be in the same format. Then split it on the / character

string[] tempsplit = datestring.Split('/');

and then put it back together

string joinstring = "/";
string newdate = tempsplit[2] + joinstring + tempsplit[1] + joinstring + tempsplit[0];

simple.

Upvotes: 4

user1465587
user1465587

Reputation:

First convert your string to DateTime format using

DateTime dt = Convert.ToDateTime("your string value");

Then save it in string using:

string st=dt.ToString("yyyy/MM/dd");

This will convert your date format to any desired format you want without depending on culture

Upvotes: 2

CloudyMarble
CloudyMarble

Reputation: 37566

Without going into the issue what format the database accepts or not, you can do the conversion like this:

  • Convert the String to Datetime like explained here
  • Change the format and convert it to string again like this

Upvotes: 1

Alexei Levenkov
Alexei Levenkov

Reputation: 100527

You can specify CultureInfo in Format and most ToString functions.

I.e. DateTime.ToString(CultureInfo) and DateTime.Parse(string, CultureInfo) will let you pars string in one culture (i.e. current or new CultureInfo("en-CA")) and format with another like new CultureInfo("en-us").

Note: you may consider running all DB access under some other culture (i.e. en-US) by setting Thread.CurrentCulture as sometimes number fomats are also impacted (if numbers are storead as string).

Upvotes: 4

Related Questions