Unable to parse date time in C# - c#

I know such questions are in ton here. Please go through once
I have a string coming from textbox having current date e.g. 10/9/2012, my class property is of DateTime? type. I am using Convert.ToDateTime(datetime_string_from_textbox) but it gives me a FormatException. I then tried DateTime.ParseExact(string, format, CultureInfo, DateTimeStyle) as suggested by Jon Skeet here but still it gave me the same exception.
One more thing — my local machine date time format is dd-mm-yyyy. When I switch this to mm/dd/yyyy format the code works fine. So basically , I want to know how to parse a valid datetime string to a DateTime object irrespective of the regional settings, or any settings or any dependency on local machine.
Is this possible?
Update : Code in use
employee.JoiningDate = DateTime.ParseExact(string.Format("{0} 00:00:00", JoiningDate.Text.Trim()), "MM/dd/yyyy hh:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
Existing Problem and Required Solution
My system datetime shows 24-10-2012 (that is, 24th Oct) and I have 10/17/2012 in my text box (that is, 17th Oct) since the text box date is also valid and after deployment again the client datetime format will become unknown so, I want a generic way to parse any valid datetime string irrespective of regional settings. Is this possible?

This should work:
var date = DateTime.ParseExact(str, "M/d/yyyy", CultureInfo.InvariantCulture);
As tested bellow: 

Try formatting your date to international date format using this method:
How would you format DateTime in international format?
Also you can check this for your current culture:
Set Default DateTime Format c#

It totally depends on the machine settings. DateTime.ParseExact(str, "dd/MM/yyyy", CultureInfo.InvariantCulture); will work for British format but it will give format exception on US format. So use format according to your machine settings.

Try the following if it works
var formatInfo = new DateTimeFormatInfo();
formatInfo.ShortDatePattern = "MM/dd/yyyy";
DateTime.Parse(date, formatInfo);

Related

DateTime Format - Any System Datetime.now to "DD/MM/YYYY hh:mm:ss"

I have a program that do several things.
Two of them is read a date from a txt and rewrite a date in the same txt.
The read of the date is a regex expression like:
[0-9]{2}/[0-9]{2}/[0-9]{4} [0-9]{2}:[0-9]{2}:[0-5]{1}[0-9]{1})
The problem is that my regex expression only works in the format
"DD/MM/YYYY hh:mm:ss" and its impossible to make sure my regex expression can match all system datetime formats.
So, I need to make sure my program run's in every system, regardless the system datetime.now.
For that, i thought about format every system datetime.now, at start, to the format mentioned "DD/MM/YYYY hh:mm:ss".
At the moment i have the following code:
Datetime currentDate = DateTime.ParseExact(DateTime.Now.ToString(), "DD/MM/YYYY hh:mm:ss", CultureInfo.InvariantCulture);
However, when running some tests, using a system date in format "D/M/YYYY h:m:s" i get the error:
"String was not recognized as a valid DateTime."
The problem is that if my date, for example, is "9/27/2019 04:26:46"(M/D/YYYY h:m:s) it can't fit in the format i defined.
Any idea?
Thank you in advance!
You need to use the same format string and culture in every place where you convert the DateTime to string as well. In your sample code, you're doing
DateTime.Now.ToString()
This uses the default culture for the thread, and the default format. Unless assigned otherwise, the thread is probably using the local culture info. Instead, you would want to use the same format and the invariant culture:
DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
(note the lowercase "dd". "DD" is not a valid format specifier for date times; these things are case sensitive. Also note the "HH", which gives a 24-hour value, rather than 12-hour)
In practice, just using the invariant culture should be enough for persistence. Cultures already include default datetime formats, so unless you have a specific need to use a different format, why not use the default?
Also note that DateTime doesn't have a format. The format only comes into play when you convert from or to a string. That is the place where you need to ensure the same culture and format is used for both sides of the operation (and that's why for persistence, especially for data shared between different users or computers, you generally want to use the invariant culture).
If you need
to make sure my program run's in every system, regardless the system datetime.now
you can adapt international standard for this, say, ISO 8601.
In order to validate the DateTime, regular expressions like you have are not enough (just imagine leap years), but TryParse does it job:
string source = "2019-09-26T23:45:59";
// Either current culture date and time format or ISO
bool isValid = DateTime.TryParse(
source,
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out var _date);
Or if you want to be more restrictive use TryParseExact:
// ISO only
bool isValid = DateTime.TryParseExact(
source,
"s",
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out var _date);
If you want to represent DateTime.Now in ISO 8601, add "s" standard format string:
string dateAsString = DateTime.Now.ToString("s");
Alas, you can provide a bunch of formats which are able to cope with any date and time formats; a classical example of ambiguous date is
01/02/03 - 01 Feb 2003 (Russia)
01/02/03 - 02 Jan 2003 (USA)
01/02/03 - 03 Feb 2001 (China)
You can alleviate the problem, while providing several formats:
// Here we try to support 4 formats (note different delimeters)
string[] formats = new string[] {
"s", // try ISO first
"dd'.'MM'.'yyyy HH':'mm':'ss", // if failed try Russian
"MM'/'dd'/'yyyy HH':'mm':'ss", // on error have a look at USA
"yyyy'-'MM'-'dd HH':'mm':'ss", // the last hope is Chinese
};
bool isValid = DateTime.TryParse(
source,
formats,
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeLocal,
out var date);

C# System.DateTime.Now returns customized time format set in windows

C# System.DateTime.Now gives me date with time , but it gives me format whatever i have set in windows calander i.e (a.m.)(p.m.) or even (xyz), how to get standard time format (AM/PM) regardless of customized time format set in windows calander?
System.DateTime.Now doesn't have any presentational format, it's the ToString() that formats it.
Like:
System.DateTime.Now.ToString("dd, MM");
check msdn for more info:
https://msdn.microsoft.com/en-us/library/8kb3ddd4%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396
If you use the DateTime as DateTime type then it will automatically show you the format of your windows. For the custom format, you have to cast it as string
string newdate = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture);
useful link MSDN

Convert date to specific format if I don't know source date format

I want to convert date to a specific format (e.g. en-US MM/dd/yyyy) and I am aware about normal method to parse it.
But in my case I'm unaware about the source date format. Source date format is subject to change as per server environment. It can be en-US or en-GB.
e.g. DateTime dt = DateTime.Now;
'dt' can be '27/03/2014' or '03/27/2014'.
How to convert the source date to en-US format if I don't know source date format?
(string format would be fine - MM/dd/yyyy e.g. "03/27/2014").
If you don't know the source format, there is a chance of getting errors while trying to convert. For example, try converting:
05/01/2013
A computer wouldn't be able to identify the date in such a case. It could result in two outputs: 05 Jan, 2013 or 01 May, 2013.
DateTime.Now.toString("yyyy-MM-dd"); //toString(specify format)
try this one
DateTime result;
if (!DateTime.TryParseExact(inputString, "dd/MM/yyyy", out result)
result = DateTime.ParseExact(inputString, "MM/dd/yyyy");
OR
DateTime result;
if (!DateTime.TryParse(inputString, out result)
result = DateTime.ParseExact(inputString, CultureInfo.InvariantCulture, DateTimeStyles.None);
If you know your environment will always be the deciding factor, why not just use that?
Try some variation of the following:
string yourFormat = ... // Whatever is your default format
if(Thread.CurrentThread.CurrentCulture.Name == "en-US")
{
yourFormat = "MM/dd/yyyy";
}
else (if Thread.CurrentThread.CurrentCulture.Name == "en-GB")
{
yourFormat = "dd/MM/yyyy";
}
DateTime d = DateTime.ParseExact(inputString, yourFormat, null)
How to convert the source date to en-US format if I don't know source date format?
You need to know the source date format, only then can you convert it to the required date format.
As wiero has rightly said in the comments "If you have 01/02/2014 depending its 1 February or 2 January. You have to know how to read it".
The default format of the object returned by DateTime.Now will be the one specified in your server setting, check the screenshot below:
Referring to #DarkWanderer's comment in question:
DateTime object has nothing to do with format.
Just needed to convert it to the specific format using ToString("MM/dd/yyyy").
I was using Parse() method to convert but it will not work. BToString() method is surely a way.
This will work: dt.Tostring("MM/dd/yyyy");
Thanks #DarkWanderer.

DateTime conversion regardless of culture

I have a text string that needs to become a DateTime object:
Feb 10, 2012 at 16:33.29
This text does not change, but the software will run on many different devices with different DateTime formats.
How can I set a custom DateTime parser so that regardless of culture I will get a fully populated DateTimeobject?
parse with CultureInfo.InvariantCulture?
Use ParseExact with a custom format string and the invariant culture:
DateTime date = DateTime.ParseExact(theString, "MMM d', 'yyyy' at 'HH':'mm'.'ss", CultureInfo.InvariantCulture);
Here’s a custom format to match your example:
var dt = DateTime.ParseExact(
"Feb 10, 2012 at 16:33.29",
"MMM d, yyyy 'at' HH:mm.ss",
CultureInfo.InvariantCulture);
One thing has got nothing to do with the other.
DateTime.Parse(value, formatstr) returns a DateTime.
The DateTime does not have a format, unless you want to talk about how it's represented in memory. When you convert it to a string, you generally do it with an implicit or explicit format, once you have it is no longer a datetime...

Convert DateTime

This works:
testDateTime = DateTime.ParseExact("16/10/2010", "dd/MM/yyyy", null);
This does NOT:
string somedate = "16/10/2010";
testDateTime = DateTime.ParseExact(somedate, "dd/MM/yyyy", null);
why??
Both code snippets are absolutely equivalent and should work/not work the same. I suspect that the value of the somedate variable is not what you think it is inside your application. Try debugging.
Both of your examples are equivalent, and should work if your current culture is en-US, but not necessarily in all other cultures.
For example, the following will throw a FormatException because the de-DE culture uses period as a separator (16.10.2010):
System.Threading.Thread.CurrentThread.CurrentCulture =
CultureInfo.CreateSpecificCulture("de-DE");
DateTime testDateTime = DateTime.ParseExact("16/10/2010", "dd/MM/yyyy", null);
In general it's good practice (FxCop will warn about it) to always specify the IFormatProvider parameter when it's available: usually either CultureInfo.CurrentCulture if you're parsing input from the current user; or CultureInfo.InvariantCulture if you're parsing input from an external source.
// For input from the current user (16.10.2010 in Germany)
testDateTime = DateTime.ParseExact("16/10/2010", "dd/MM/yyyy", CultureInfo.CurrentCulture);
// For input from an external source in a defined culture-invariant format
testDateTime = DateTime.ParseExact("16/10/2010", "dd/MM/yyyy", CultureInfo.InvariantCulture);
It worked fine when I tried it... Just copied and pasted it.
Insert a breakpoint, put your pointer over the variable and check the month, day and year member. If they are not rights, show us what you see.
If you are using a print or msgbox to show the value of the variable, maybe you are not suplying a mask/format for the output.
You are trying to change the DateTime format right? You can not do that with a DateTime object. You can change the format only when you display the DateTime object using String.Format: String.Format("{0:d/M/yyyy HH:mm:ss}", dt). (for example or other methods)
Both the things worked for me when I tried. What is the error you are getting?
The ParseExact() uses the second parameter to parse your input string and not to return the value in that format.
EDIT: from Joe's comment below - The output you get will be in "MM/dd/yyyy" format" - the output will be a DateTime type that doesn't have any intrinsic format.
for some reason it would not work for me UNTIL i added this: CultureInfo.InvariantCulture
DateTime.ParseExact(sValue, "dd/MM/yyyy", CultureInfo.InvariantCulture);

Categories

Resources