sidd
sidd

Reputation: 103

How do I convert a string to Date Time in a particular format in C#?

I'm trying to convert "1/7/2014 1:37 PM" (which is a string) to "01/07/2014 13:37" (DateTime format). What would be the best way to do this?

This is what I've got

        string dateString = "1/27/2014 1:37 PM"; 
        string format = "MM/dd/yyyy HH:mm";
        DateTime dt;
        bool temp = DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
        Console.WriteLine("bool = {0}, dt ={1}", temp, dt);

And my output is

        bool = False, dt =1/1/0001 12:00:00 AM

Much thanks.

EDIT:

It's not just for the string I specified. Adding a few more cases - The LHS should get parsed exactly to the RHS

    1/7/2014 1:37 PM -> 01/07/2014 13:37

    11/27/2014 1:40 AM -> 11/27/2014 01:40

    1/12/2014 2:05 PM -> 01/12/2014 14:05

Essentially, the input string does not have leading zeros and time is in 12 hour format and the output should have leading zeros where needed and should display the time in 24 hour format

I've tried giving

    string format = "MM/dd/yyyy HH:mm tt";

but that also gives the same wrong output

    bool = False, dt =1/1/0001 12:00:00 AM

Upvotes: 0

Views: 1504

Answers (8)

Tim Schmelter
Tim Schmelter

Reputation: 460268

Four things to change:

  1. You need lowercase h for hours if you use the am/pm designator
  2. You need a single h if the hour can be 1
  3. You need to add tt for the am/pm designator
  4. You need a single M for the month since it's 1

string dateString = "1/27/2014 1:37 PM"; 
string format = "M/dd/yyyy h:mm tt";
DateTime dt;
bool temp = DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);

Console.Write("temp: {0} date:{1}", temp, dt); // temp: True date:1/27/2014 1:37:00 PM

See: The "tt" Custom Format Specifier

Update: acccording to your edit:

I also need to convert it back to string in a specific format. It should have leading zeros and time is in 12 hour format and the output should have leading zeros where needed and should display the time in 24 hour format

1/7/2014 1:37 PM -> 01/07/2014 13:37
11/27/2014 1:40 AM -> 11/27/2014 01:40
1/12/2014 2:05 PM -> 01/12/2014 14:05

Then you can use this format string: MM/dd/yyyy HH:mm in DateTime.ToString with CultureInfo.InvariantCulture. Note that i've used uppercase HH for 24h hour format:

string output = dt.ToString("MM/dd/yyyy HH:mm", CultureInfo.InvariantCulture);

You need InvariantCulture, otherwise / will be replaced with the actual date-separator of your current culture (f.e. . in germany).

See: The "/" Custom Format Specifier

Upvotes: 4

Pratius Dubey
Pratius Dubey

Reputation: 673

Maybe you can try like this

DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);
Console.WriteLine(String.Format("{0:MM/dd/yyyy}", dt));

Upvotes: 1

Darin Dimitrov
Darin Dimitrov

Reputation: 1039408

Your format is wrong. You are missing the AM/PM:

string format = "M/dd/yyyy h:mm tt";

Notice the tt part which is required in order to be able to properly parse the date. Also I would recommend you adding error checking:

string dateString = "1/27/2014 1:37 PM"; 
string format = "M/dd/yyyy h:mm tt";
DateTime dt;
bool temp = DateTime.TryParseExact(dateString, format, CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
if (temp)
{
    Console.WriteLine("bool = {0}, dt = {1:M/dd/yyyy h:mm}", temp, dt);
}
else
{
    Console.WriteLine("Unable to parse date: {0}", dateString);
}

Upvotes: 0

Soner Gönül
Soner Gönül

Reputation: 98858

From DateTime.TryParseExact method

Converts the specified string representation of a date and time to its DateTime equivalent using the specified format, culture-specific format information, and style. The format of the string representation must match the specified format exactly.

In your case, it is not.

  • MM format is for 01 to 12, use M format which is 1 to 12.
  • HH format is for 00 to 23, use h format instead which is 1 to 12.

Also you are missing tt format which is for AM/PM designator.

string str  = "1/27/2014 1:37 PM";
string format = "M/dd/yyyy h:mm tt";
DateTime dt;
bool result = DateTime.TryParseExact(str,
                                     format,
                                     CultureInfo.InvariantCulture,
                                     DateTimeStyles.None, out dt);
Console.WriteLine(result);

Output will be

True

Here a demonstration.

Upvotes: 0

Khan
Khan

Reputation: 342

This may help:-

DateTime txtmyDate = DateTime.ParseExact(dateString "MM/dd/yyyy hh:mm",     
CultureInfo.InvariantCulture);

Upvotes: 0

tarzanbappa
tarzanbappa

Reputation: 4978

Try This...

 static void Main(string[] args)
            {
                string dateString = "1/27/2014 1:37 PM";
                string format = "MM/dd/yyyy HH:mm";


                DateTime dt2 = Convert.ToDateTime(dateString);

                Console.WriteLine(dt2.ToString(format));
                Console.ReadLine();
            }

Upvotes: 0

Shashank
Shashank

Reputation: 399

You can use

 Datetime dtDate = DateTime.PareExact(dt,"DateFormat of dt",cultureInfo.InavriantCulture);

Upvotes: 0

Rawling
Rawling

Reputation: 50184

You should be using

  • lowercase h rather than H as the time is in 12-, not 24-hour
  • one h rather than two as you don't have a leading zero on the hour
  • one M rather than two as you don't have a leading zero on the month
  • tt to match AM or PM.

Custom Date and Time Format Strings

Upvotes: 0

Related Questions