C#: ShortDatePattern giving incorrect result - c#

I have dd-MM-yyyy date pattern for my windows machine. In below code I'm trying to get date format through C# code, but it's giving me M/d/yyy instead of dd-MM-yyyy. In code is correct ?
Console.WriteLine(DateTime.Now);
Console.WriteLine(CultureInfo.CurrentUICulture.DateTimeFormat.ShortDatePattern);

Use CurrentCulture instead of CurrentUICulture`.
CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern
CurrentCulture is for formatting of numbers and dates.
CurrentUICulture for localisation.

Try this:-
You are using CurrentUICulture which is used for localisation instead use CurrentCulture which is used for formatting of numbers and dates
Console.WriteLine(DateTime.Now);
Console.WriteLine(CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern);

You can probably use: DateTime.Now.ToString("d");
Documentation about DateTime formatting can be found here: Standard DateTime Format Strings

Related

Transform between datetime formats

I am facing a problem in which I need to transform dates in a given input format into a target one. Is there any standard way to do this in C#?
As an example say we have yyyy.MM.dd as the source format and the target format is MM/dd/yyy (current culture).
The problem arises since I am using a parsing strategy that gives priority to the current culture and then if it fails it tries to parse from a list of known formats. Now say we have two equivalent dates one in the source culture above (2015.12.9) and the other in the current culture (9/12/2015). Then if we attempt to parse this two dates the month will be 12 for the first case and in the second will be 9, so we have an inconsistency (they were supposed to mean be the same exact date).
I believe that if existing it should be something as
DateTime.Convert(2015.12.9, 'yyyy/MM/dd', CultureInfo.CurrentCulture).
Any ideas?
EDIT:
Thank you all for your ideas and suggestions, however the interpretation most of you gave to my question was not quite right. What most of you have answered is a direct parse in the given format and then a conversion to the CurrentCulture.
DateTime.ParseExact("2015.12.9", "yyyy.MM.dd", CultureInfo.CurrentCulture)
This will still return 12 as month, although it is in the CurrentCulture format. My question thus was, is there any standard way to transform the date in yyyy.MM.d to the format MM/dd/yyy so that the month is now in the correct place and THEN parsed it in the target culture. Such function is likely to be unexisting.
DateTime.ParseExact is what you are looking for:
DateTime parsedDate = DateTime.ParseExact("2015.12.9", "yyyy.MM.d", CultureInfo.InvariantCulture);
Or eventualy DateTime.TryParseExact if you're not confident with input string.
I know it's late but I try to explain little bit deep if you let me..
I am facing a problem in which I need to transform dates in any format
to a target one.
There no such a thing as dates in any format. A DateTime does not have any implicit format. It just has date and time values. Looks like you have a string which formatted as date and you want to convert another string with different format.
Is there any standard way to do this in C#?
Yes. You can parse your string with DateTime.ParseExact or DateTime.TryParseExact first with specific format to DateTime and then generate it's string representation with a different format.
As an example say we have yyyy.MM.dd as the source format and the
target format is MM/dd/yyy (current culture).
I didn't understand what is the meaning of current culture in this sentences and I assume you want yyyy not yyy, but you can generate it as I described above like;
string source = "2015.12.9";
DateTime dt = DateTime.ParseExact(source, "yyyy.MM.d", CultureInfo.InvariantCulture);
string target = dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture); // 12/09/201
The problem arises since I am using a parsing strategy that gives
priority to the current culture and then if it fails it tries to parse
from a list of known formats.
Since you didn't show any parsing strategy and there is no DateTime.Convert method in .NET Framework, I couldn't any comment.
Now say we have two equivalent dates one in the source culture above
(2015.12.9) and the other in the current culture (9/12/2015). Then if
we attempt to parse this two dates the month will be 12 and in the
second will be 9, so we have an inconsistency.
Again.. You don't have DateTime's. You have strings. And those formatted strings can't belong on any culture. Sure all cultures might parse or generate different string representations with the same format format a format does not belong any culture.
I assume you have 2 different string which different formatted and you wanna parse the input no matter which one it comes. In such a case, you can use DateTime.TryParseExact overload that takes string array for all possible formats as a parameter. Then generate it's string representation with MM/dd/yyy format and a culture that has / as a DateSeparator like InvariantCulture.
string s = "2015.12.9"; // or 9/12/2015
string[] formats = { "yyyy.MM.d", "d/MM/yyyy" };
DateTime dt;
if (DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
Console.WriteLine(dt.ToString("MM/dd/yyyy", CultureInfo.InvariantCulture));
}
The Simple and Best way to do it is Using .ToString() Method
See this code:
DateTime x =DateTime.Now;
To Convert This Just Write like This:
x.ToString("yyyyMMdd")//20151210
x.ToString("yyyy/MM/dd)//2015/12/10
x.ToString("yyyy/MMM/dd)//2015/DEC/10 //Careful About M type should be capital for month .
Hope helpful

Formatting DateTime - ignore culture

I need to format a date to the following format:
M-d-yyyy
I tried using:
string.Format("{0:M-d-yyyy}", DateTime.Now)
But the output string will depend on the CurrentCulture on the computer where it's run, so sometimes the output might be 07/09/2014 or 07.09.2014 instead of 09-07-2014.
How can I easily prevent it from converting it based on the culture and treating it as a literal string?
Use CultureInfo.InvariantCulture as the culture or provider argument.
String.Format(CultureInfo.InvariantCulture, "{0:M-d-yyyy}", DateTime.Now)
Use CultureInfo.InvariantCulture as an IFormatProvider parameter:
DateTime.Now.ToString("M-d-yyyy", CultureInfo.InvariantCulture);
You can set the culture of your program with this:
Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.InvariantCulture;`
You can also use a specific culture if you want (I think en-US is the one you need)
Use the following:
DateTime.Now.ToString("d", DateTimeFormatInfo.InvariantInfo);
or apply other formatting specs as detailed in http://msdn.microsoft.com/en-us/library/az4se3k1%28v=vs.110%29.aspx
Pertinent to your case it could be written as:
DateTime.Now.ToString("M-d-yyyy", DateTimeFormatInfo.InvariantInfo);
Regards,
You can use the .ToString() method on the DateTime object to format it however you'd like. Your code would look something like this:
DateTime.Now.ToString("M-d-yyyy");
More info on formatting date times can be found on the MSDN: http://msdn.microsoft.com/en-us/library/zdtaw1bw%28v=vs.110%29.aspx
you can try
date.ToString("MM/dd/yy", yyyymmddFormat);
or
try whats in this link
http://social.msdn.microsoft.com/Forums/en-US/af4f5a1e-f81d-47fe-981d-818e785b8847/convert-string-to-datetime-object
you can force the string into a standard format if you like

.NET DateTime not returning AM/PM in ToShortTimeString()

I've run into a problem that's driving me crazy. In my application (ASP.NET MVC2 /.NET4), I simply running this:
DateTime.Now.ToShortTimeString()
All the examples I've seen indicate I should get something like: 12:32 PM, however I'm getting 12:32 without the AM/PM.
I launched LinqPad 4 to see if I could replicate this. Instead, it returns 12:32 PM correctly.
What the hell?
You may also try a custom format to avoid culture specific confusions:
DateTime.Now.ToString("hh:mm tt")
KBrimington looks to be correct:
The string returned by the ToShortTimeString method is culture-sensitive. It reflects the pattern defined by the current culture's DateTimeFormatInfo object. For example, for the en-US culture, the standard short time pattern is "h:mm tt"; for the de-DE culture, it is "HH:mm"; for the ja-JP culture, it is "H:mm". The specific format string on a particular computer can also be customized so that it differs from the standard short time format string.
From MSDN
If you don't want to mess with the Culture for your whole thread/application, try this:
CultureInfo ci = new CultureInfo("en-US");
string formatedDate = DateTime.Now.ToString("t", ci);
You can find the list of DateTime Format strings here.
Yeah, this depends on your Locale. What is the value of System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat.ShortTimePattern in your application?
See MSDN Link
You can set the thread's culture info and this will then be used by the ToShortTimeString() method. But understand that this will effect all code running in that thread.
System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");
The function uses the users default patterns. They can be changed in the Control panel. Check out first tab in the 'Region and Language' Settings. Change the Short time pattern to a pattern that like 'h:mm tt' and you're done.
This may also need the CultureInfo.InvariantCulture
e.g. DateTime.Now.ToString("hh:mm:ss tt", CultureInfo.InvariantCulture)

how to change culture date format in c#?

how to change culture date format in c#
Are you asking for this?
Formatting Date and Time for a Specific Culture
If you need to you can change the culture for the current thread so you don't have to do it for each call.
Thread.CurrentThread.CurrentCulture = New CultureInfo("th-TH", False)
More information here:
http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentuiculture%28VS.71%29.aspx
For example in DateTimePicker you can use CustomFormat property to add the format you want(independent on culture). or see #gcores's answer.

How to format a Date without using code - Format String Question

How can I achieve the following with a format string: Do 01.01.2009 ?
It has to work in all languages (the example would be for Germany). So there should only be the short weekday and then the short date.
I tried 'ddd d' (without the '). However, this leads to 'Do 01'.
Is there maybe a character I can put before the 'd' so that it is tread on its own or something like that?
DateTime.Now.ToString("ddd dd/MM/yyyy")
You should be using the ISO 8601 standard if you are targeting audiences with varied spoken languages.
DateTime.Now.ToString("ddd yyyy-MM-dd");
Alternatively, you can target the current culture with a short date:
DateTime.Now.ToString("d", Thread.CurrentThread.CurrentCulture);
or a long date:
DateTime.Now.ToString("D", Thread.CurrentThread.CurrentCulture);
To get the locale specific short date, as well as the locale day name then you're going to have to use two calls, so:
myDate.ToString("ddd ") + myDate.ToString("d");
Have you considered using the long date format instead?
If you want to localize (I assume so, since you said "all languages"), you can use CultureInfo to set the different cultures you want to display. The MSDN library has info on Standard Date and Time Format Strings and CultureInfo Class.
The example MSDN provides:
// Display using pt-BR culture's short date format
DateTime thisDate = new DateTime(2008, 3, 15);
CultureInfo culture = new CultureInfo("pt-BR");
Console.WriteLine(thisDate.ToString("d", culture)); // Displays 15/3/2008
Just for reference, in Java it goes like this:
DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
Date date = new Date();
String formattedDate = dateFormat.format(date);
If you want to ensure the same characters are used as separators, you have to use a backslash to escape the character, otherwise it will default to the locale you are in. I recommend using this string if you want the format you specified in your question
DateTime.Now.ToString("ddd dd.MM.yyyy");
To use forward slashes instead, you should escape them so that they always output as slashes.
DateTime.Now.ToString("ddd dd\\/MM\\/yyyy");

Categories