Human readable date to DateTime [duplicate] - c#

This question already has answers here:
DateTime Conversion and Parsing DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff")
(3 answers)
Closed 9 years ago.
I need to convert from a "human readable" date format to DateTime, for example:
From: January 20, 2013
To: MM/dd/yyyy
Does anybody know what's the format or if there's one for doing this with DateTime.Parse and providing the format? I just want to check before jumping into a date parser.

Custom Date and Time Format Strings
MMMM dd, yyyy is a format string you're looking for.
Use DateTime.ParseExact or DateTime.TryParseExact to parse the datetime using specific format string.
After parsing you'll be able to print the value in format you want:
string input = "20, 2013";
DateTime value;
if (DateTime.TryParseExact(input, "dd, yyyy", CultureInfo.CurrentCulture, DateTimeStyles.None, out value))
{
string output = value.ToString("dd/MM/yyyy");
}

I'm not quite sure your goal, but are you trying to format your DateTime based upon which MM/dd/yyyy format that you choose?
If you are you would simply do:
DateTime.Now.ToString(MM/dd/yyy);
DateTime.Now.ToString(MMMM, MM dd, yyyy);
DateTime.Now.ToString(MMMM, MM dd, yyyy hh:mm:ss);
Essentially you have to use these:
Capital MM : Represents the Month, so MMMM (Also creates the Long Date).
Lowercase d : Will represent the day.
Lowercase y: Will represent the year.
Then the hh:mm:ss will actually add an hour, minute, second.
You can also utilize Parse to also ensure it is correctly captured.
Essentially you can easily manage or alter the Format based on whatever you require. MSDN has some great articles on this as well.
Hopefully that helps. Looks like while I was posting a few answers got generated. So your going to get some solid feedback.

Related

C# ParseExact not picking the format

I Need help with this simple and silly thing ..
Want to be able to convert this string representation "Oct 9 2017 2:45:67:145PM" to date.
I am using code below:
string strDate = "Oct 9 2017 2:45:67:145PM";
DateTime dtTroubleDate;
dtTroubleDate = DateTime.ParseExact(strDate.ToString(), "MMM d yyyy h:mm:ss:ffftt", CultureInfo.InvariantCulture);
MessageBox.Show("dtTroubleDate String : " + dtTroubleDate.ToString());
This is a C# code within a SSIS package. I am reading the date from a file.
Need to store in the database as 'datetime2'
Never in the history of the Gregorian calendar have been a time with 67 seconds...
This must be a typo in the file itself. The format you are using is OK, but I would recommend using TryParseExact instead of ParseExact for this very reason.
When using ParseExact you are basically saying "I know the string representation of the datetime value will always be in this specific format and I will always be able to parse it.
However, that is rarely the case - as most of the time string representation of datetime values are written by fallible humans, occasionally there will be typos - and that's exactly what the TryParse methods are all about.
string strDate = "Oct 9 2017 2:45:67:145PM";
DateTime dtTroubleDate;
if(DateTime.TryParseExact(
strDate,
"MMM d yyyy h:mm:ss:ffftt",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out dtTroubleDate))
{
// Datetime is valid
}

Parsing Date Time in C#, Getting wrong output

I am trying to parse the date by using below code
DateTime mydate = DateTime.ParseExact(datetoconvert,"dd/mm/yyyy",System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat);
but its output is wrong, the datetoconvert in above code is 30/Mar/2017 but output is 29/Jan/2017
looking forward for your valuable answers...
Lowercase mm means minute, use MM
DateTime mydate = DateTime.ParseExact(datetoconvert,"dd/MM/yyyy",System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat);
If you want to output it as 30/Mar/2017(different topic):
string result = mydate.ToString("dd/MMM/yyyy", CultureInfo.InvariantCulture);
But note that / has a special meaning too(in Parse and ToString). It will be replaced with your current cultures date-separator which seems to be / but fails with a different. You can avoid it by specifying CultureInfo.InvariantCulture or by masking it by wrapping it with apostrophes:
DateTime mydate = DateTime.ParseExact(datetoconvert,"dd'/'MM'/'yyyy",System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat);
replace
"dd/mm/yyyy"
with
"dd/MMM/yyyy"
because "Jan" is matched by MMM instead of mm (for minutes)
Reference
"MMM" The abbreviated name of the month.
https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx
The date format is wrong. try "dd/MM/yyyy" instead of "dd/mm/yyyy"
If you need abbrivated month name, use "dd/MMM/yyyy"

DateTime Converted to Invalid Format

I tried converting 9/29/2013 2:44:28 PM (mm/dd/yyyy) to dd/mm/yyyy format.
I got a strange Date after Converting.
I tried
dateTimeVar.ToString("dd/mm/yyyy");
29/44/2013
The Date was a type of DateTime itself.
Lowercase mm means minutes, try this instead:
dateTimeVar.ToString("dd/MM/yyyy");
However, if this works depends on your local culture. If your current culture's date separator is different, / will be replaced with that. So if you want to enforce it use CultureInfo.InvariantCulture:
dateTimeVar.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);
MM is for months, mm is for minutes. That's why it gets your minutes (which is 44) instead of your month value.
Use it like;
dateTimeVar.ToString("dd/MM/yyyy");
Check out;
The "MM" Custom Format Specifier
The "mm" Custom Format Specifier
And remember, / has special meaning when you use it as a date separator. It replace itself with your current culture date separator. Forcing to use with InvariantCulture would be better.
dateTimeVar.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture);
Take a look at;
The "/" Custom Format Specifier
What if I want to convert a string in dd/MM/yyyy to DateTime?
Then you can use DateTime.ParseExact method.
Converts the specified string representation of a date and time to its
DateTime equivalent using the specified format and culture-specific
format information. The format of the string representation must match
the specified format exactly.
As an example;
string s = "01/01/2013";
DateTime dt = DateTime.ParseExact(s, "dd/MM/yyyy", CultureInfo.InvariantCulture);
Console.WriteLine(dt);
Output will be;
1/1/2013 12:00:00 AM
Here a DEMO.
dateTimeVar.ToString("dd/mm/yyyy"); // Change to dd/MM/yyyy
The problem is mm stands for minute and you need MM which would be months
Tim's answer is correct, but to remove the format string altogether you can use. 'ToShortDateString'
DateTime date = DateTime.Today;
var stringDate = date.ToShortDateString();
var stringDate2 = date.ToString("dd/MM/yyyy");

How to parse a string into a date time format in C#

i have a string which contains date time this...
string S="08/18/2013 24:00:00"
DateTime DT = DateTime.ParseExact(S, "MM/dd/yyyy HH:mm:ss", null);
i want to parse it into date time but shows an exception like this.
The DateTime represented by the string is not supported in calendar System.Globalization.GregorianCalendar.
please tell me any solution for this problem.
The problem is with the hour being 24. DateTime doesn't support this, as far as I'm aware.
Options:
Use my Noda Time project which does support 24:00:00, but basically handles it by adding a day (it doesn't preserve a difference between that and "end of previous day")
Keep using DateTime, manually replace "24:00:00" with "00:00:00" when it occurs, and remember to add a day afterwards
If you want to preserve the information that it was actually "end of the day" you'd need to do that separately, and keep the information alongside the DateTime / LocalDateTime.
You should also parse with the invariant culture as other answers have suggested - you're not trying to parse a culture-specific string; you know the exact separators etc.
string S="08/18/2013 00:00:00"; // here is the first problem occurred
DateTime DT = DateTime.ParseExact(S, "MM/dd/yyyy hh:mm:ss", System.Globalization.CultureInfo.InvariantCulture);
From The "HH" Custom Format Specifier
The "HH" custom format specifier (plus any number of additional "H"
specifiers) represents the hour as a number from 00 through 23; that
is, the hour is represented by a zero-based 24-hour clock that counts
the hours since midnight.
So, using 24 as an hour is invalid on this case.
Try with hh format with 00 instead like;
string S = "08/18/2013 00:00:00";
DateTime DT = DateTime.ParseExact(S, "MM/dd/yyyy hh:mm:ss", CultureInfo.InvariantCulture);
Here a DEMO.
If you really want to use 24:00:00 as a hour, take a look Noda Time which developed by Jon.

converting a string to date in the exact manner

I have a string "11 Jan 2011" which I want to convert to the datatype date (i.e 11 Jan 2011).
I have tried all resources about datetime.parse, datetime.parse exact but all these things gives me the same output 2011/01/11 12:00:00 AM. I really don't understand this behaviour. I tried the following:
1.DateTime date = DateTime.Parse("11 Jan 2011");
2.DateTime date = DateTime.ParseExact("11 Jan 2011" , #"dd MMM yyyy", System.Globalization.CultureInfo.InvariantCulture);
parsing and displaying are not the same thing
you parse the original string to a DateTime object but display results using Date/Time format strings
Both your calls are correct.
A DateTime structure preserves no information about formatting; it just represents the raw date and time.
What you need to do is ensure that when you display your date, you do so in the correct format - e.g. by calling string displayString = date.ToString("dd MMM yyyy");

Categories

Resources