Reputation: 195
When we execute
Convert.ToDateTime('08/01/2014')
how does it convert to 1-Aug-2014 (ignore the format) and not to 8-Jan-2014?
As far as I saw, there is no mention of any format for the string parameter that is being passed on to this method.
Upvotes: 0
Views: 19984
Reputation: 98750
First of all, it is Convert.ToDateTime("08/01/2014")
not Convert.ToDateTime('08/01/2014')
. Strings are represents with double quotes, not single quotes.
Convert.ToDateTime(string)
method uses CurrentCulture
as an IFormatProvider
by default. Here how it's implemented;
public static DateTime ToDateTime(String value)
{
if (value == null)
return new DateTime(0);
return DateTime.Parse(value, CultureInfo.CurrentCulture);
}
And DateTime.Parse(string, IFormatProvider)
implemented as;
public static DateTime Parse(String s, IFormatProvider provider)
{
return (DateTimeParse.Parse(s, DateTimeFormatInfo.GetInstance(provider), DateTimeStyles.None));
}
From documentation;
If value is not null, the return value is the result of invoking the DateTime.Parse method on value using the formatting information in a DateTimeFormatInfo object that is initialized for the current culture. The value argument must contain the representation of a date and time in one of the formats described in the DateTimeFormatInfo topic.
So, what is DateTimeFormatInfo
topic here exactly? It is the DateTimeFormatInfo
's information with DateTimeFormatInfo.GetAllDateTimePatterns
method.
Most probably your current thread culture has a MM/dd/yyyy
not dd/MM/yyyy
(or which character is your DateSeparator
of your CurrentCulture
because "/"
custom format specifier has a special meaning as replace me current culture or specified culture date separator) as a standard date and time format.
You can see all standard date and time formats of your CurrentCulture
with;
var patterns = CultureInfo.CurrentCulture.
DateTimeFormat.
GetAllDateTimePatterns();
foreach (var format in patterns)
{
Console.WriteLine(format);
}
Let me give you an example; my current thread culture is Turkish (tr-TR
). And it has dd.MM.yyyy
as a standard date and time format.
That's why when I write Convert.ToDateTime("02.01.2014")
in my code, it parses this string as January 2nd not February 1st.
@SonerGönül My CurrentCulture is "en-US"! – Salihdeen 3 mins ago
Exactly as I said, your en-US
has MM/dd/yyyy
but not dd/MM/yyyy
as a standard date and time format. That's why your 08/01/2014
string parsed with MM/dd/yyyy
pattern not dd/MM/yyyy
.
var patterns = CultureInfo.GetCultureInfo("en-US").
DateTimeFormat.
GetAllDateTimePatterns();
foreach (var format in patterns)
{
Console.WriteLine(format);
}
Result will be;
M/d/yyyy
M/d/yy
MM/dd/yy
MM/dd/yyyy <-- HERE!
yy/MM/dd
yyyy-MM-dd
dd-MMM-yy
dddd, MMMM dd, yyyy
MMMM dd, yyyy
dddd, dd MMMM, yyyy
dd MMMM, yyyy
dddd, MMMM dd, yyyy h:mm tt
dddd, MMMM dd, yyyy hh:mm tt
dddd, MMMM dd, yyyy H:mm
dddd, MMMM dd, yyyy HH:mm
MMMM dd, yyyy h:mm tt
MMMM dd, yyyy hh:mm tt
MMMM dd, yyyy H:mm
MMMM dd, yyyy HH:mm
dddd, dd MMMM, yyyy h:mm tt
dddd, dd MMMM, yyyy hh:mm tt
dddd, dd MMMM, yyyy H:mm
dddd, dd MMMM, yyyy HH:mm
dd MMMM, yyyy h:mm tt
dd MMMM, yyyy hh:mm tt
dd MMMM, yyyy H:mm
dd MMMM, yyyy HH:mm
dddd, MMMM dd, yyyy h:mm:ss tt
dddd, MMMM dd, yyyy hh:mm:ss tt
dddd, MMMM dd, yyyy H:mm:ss
dddd, MMMM dd, yyyy HH:mm:ss
MMMM dd, yyyy h:mm:ss tt
MMMM dd, yyyy hh:mm:ss tt
MMMM dd, yyyy H:mm:ss
MMMM dd, yyyy HH:mm:ss
dddd, dd MMMM, yyyy h:mm:ss tt
dddd, dd MMMM, yyyy hh:mm:ss tt
dddd, dd MMMM, yyyy H:mm:ss
dddd, dd MMMM, yyyy HH:mm:ss
dd MMMM, yyyy h:mm:ss tt
dd MMMM, yyyy hh:mm:ss tt
dd MMMM, yyyy H:mm:ss
dd MMMM, yyyy HH:mm:ss
M/d/yyyy h:mm tt
M/d/yyyy hh:mm tt
M/d/yyyy H:mm
M/d/yyyy HH:mm
M/d/yy h:mm tt
M/d/yy hh:mm tt
M/d/yy H:mm
M/d/yy HH:mm
MM/dd/yy h:mm tt
MM/dd/yy hh:mm tt
MM/dd/yy H:mm
MM/dd/yy HH:mm
MM/dd/yyyy h:mm tt
MM/dd/yyyy hh:mm tt
MM/dd/yyyy H:mm
MM/dd/yyyy HH:mm
yy/MM/dd h:mm tt
yy/MM/dd hh:mm tt
yy/MM/dd H:mm
yy/MM/dd HH:mm
yyyy-MM-dd h:mm tt
yyyy-MM-dd hh:mm tt
yyyy-MM-dd H:mm
yyyy-MM-dd HH:mm
dd-MMM-yy h:mm tt
dd-MMM-yy hh:mm tt
dd-MMM-yy H:mm
dd-MMM-yy HH:mm
M/d/yyyy h:mm:ss tt
M/d/yyyy hh:mm:ss tt
M/d/yyyy H:mm:ss
M/d/yyyy HH:mm:ss
M/d/yy h:mm:ss tt
M/d/yy hh:mm:ss tt
M/d/yy H:mm:ss
M/d/yy HH:mm:ss
MM/dd/yy h:mm:ss tt
MM/dd/yy hh:mm:ss tt
MM/dd/yy H:mm:ss
MM/dd/yy HH:mm:ss
MM/dd/yyyy h:mm:ss tt
MM/dd/yyyy hh:mm:ss tt
MM/dd/yyyy H:mm:ss
MM/dd/yyyy HH:mm:ss
yy/MM/dd h:mm:ss tt
yy/MM/dd hh:mm:ss tt
yy/MM/dd H:mm:ss
yy/MM/dd HH:mm:ss
yyyy-MM-dd h:mm:ss tt
yyyy-MM-dd hh:mm:ss tt
yyyy-MM-dd H:mm:ss
yyyy-MM-dd HH:mm:ss
dd-MMM-yy h:mm:ss tt
dd-MMM-yy hh:mm:ss tt
dd-MMM-yy H:mm:ss
dd-MMM-yy HH:mm:ss
MMMM dd
MMMM dd
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
yyyy'-'MM'-'dd'T'HH':'mm':'ss.fffffffK
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
ddd, dd MMM yyyy HH':'mm':'ss 'GMT'
yyyy'-'MM'-'dd'T'HH':'mm':'ss
h:mm tt
hh:mm tt
H:mm
HH:mm
h:mm:ss tt
hh:mm:ss tt
H:mm:ss
HH:mm:ss
yyyy'-'MM'-'dd HH':'mm':'ss'Z'
dddd, MMMM dd, yyyy h:mm:ss tt
dddd, MMMM dd, yyyy hh:mm:ss tt
dddd, MMMM dd, yyyy H:mm:ss
dddd, MMMM dd, yyyy HH:mm:ss
MMMM dd, yyyy h:mm:ss tt
MMMM dd, yyyy hh:mm:ss tt
MMMM dd, yyyy H:mm:ss
MMMM dd, yyyy HH:mm:ss
dddd, dd MMMM, yyyy h:mm:ss tt
dddd, dd MMMM, yyyy hh:mm:ss tt
dddd, dd MMMM, yyyy H:mm:ss
dddd, dd MMMM, yyyy HH:mm:ss
dd MMMM, yyyy h:mm:ss tt
dd MMMM, yyyy hh:mm:ss tt
dd MMMM, yyyy H:mm:ss
dd MMMM, yyyy HH:mm:ss
MMMM, yyyy
MMMM, yyyy
Upvotes: 2
Reputation: 1434
Use this.
DateTime.ParseExact(string datetime, string format, IFormatProvider provider)
eg:
DateTime.ParseExact("08-01-2014", "MM-dd-yyyy", new CultureInfo("en-US"))
Upvotes: 0
Reputation: 50114
If value is not null, the return value is the result of invoking the DateTime.Parse method on value using the formatting information in a DateTimeFormatInfo object that is initialized for the current culture.
Upvotes: 3