Cannot convert 'string' to 'System.DateTime' C# WPF - c#

Firstly, I want to say that I read many questions about similar problem and I couldn't find anything.
The difference is that I can't use DateTime.Now property, and I can't choose any specific date.
It is on the user to choose one date from DatePicker
I have tried Convert, Parse, tryParse, but still couldn't solve it...
This code will work fine if I use String in my class instead of DateTime, but I need to use DateTime type. Also, I don't want to display time, that's why I have formated like this. Can I get value to string, so I can parse it later?
string chosenDate = datePicker.SelectedDate.GetValueOrDefault().ToString("dd/MM/yyyy"); //error
After that I thought to move value to my object. This is what I did:
newObject = new Classes.MyClass(DateTime.Parse(chosenDate));
I have lost all ideas...
Thank you in advance.
EDIT:
Sorry for too little information about problem.
The problem is that I have a DataGrid which has binding on DateTime date (in .cs). I tried this way because it won't show time, but if I apply the following it shows the time in my result as you can see.

If MyClass expects a DateTime, you should use the value from the DatePicker's SelectedDate property. It returns a Nullable<DateTime> that can be converted to a DateTime using the GetValueOrDefault() method:
newObject = new Classes.MyClass(datePicker.SelectedDate.GetValueOrDefault());
If there is no date selected, GetValueOrDefault() will return DateTime.MinValue.
The DatePicker doesn't store the date in any particular format. That's a formatting thing.
It doesn't set the time either. If you however set the time yourself, you could strip it away using the Date property of the Date time:
datePicker.SelectedDate.GetValueOrDefault().Date

Related

WPF Datepicker - SelectedDate just date and not time

I know this may be a duplicate but using the .NET framework I can't seem to get the date and not the time for a WPF DatePicker.
I have this:
DatePicker.SelectedDate.Value.Date
I believed using the "Date" property would only return the date, but it returns the time "12:00:00" as well.
I read https://learn.microsoft.com/en-us/dotnet/api/system.datetime.date so I'm not sure what I am doing wrong.
I'm sure it's something silly as always, but with no helpful eye with me to tell me, I thought I resort to SO!
DatePicker.SelectedDate.Value.Date is a DateTime Nullable property. So any DateTime Property has the date and time section. but in this case it is not fill with the correct value and it will gives you the default value. if you want to get the date only use following code,
DatePicker.SelectedDate.Value.Date.ToShortDateString()
SelectedDate property is of type Nullable<DateTime> it gives you the date however the time is reset as 12:00:00 midnight (00:00:00)
see more on DatePicker.SelectedDate Property
from MSDN: DateTime.Date Property
The value of the Kind property of the returned DateTime value is the same as that of the current instance.
Because the DateTime type represents both dates and times in a single type, it is important to avoid misinterpreting a date returned by the Date property as a date and time. For more information, see "Saving and Restoring DateTime Values" in the DateTime topic.
While selecting the date from the datepicker in you code you can do following:
DateTime from = From_Date_Picker.SelectedDate.Value.Date
The following example uses the Date property to extract the date component of a DateTime value with its time component set to zero (or 0:00:00, or midnight). It also illustrates that, depending on the format string used when displaying the DateTime value, the time component can continue to appear in formatted output.
That says that depending on the Format (in this case the DatePicker i think) the Time component can appear. Like in your link, the Output is 12:00 AM
So Check the Format / properties of the DatePicker.
in your code, you can do the following:
string shortDate = datePicker.SelectedDate.Value.ToShortDateString();
or, if you'd like to specify the format of the date:
string formatDate = datePicker.SelectedDate.Value.ToString("yyyy-MM-dd");
Here datePicker is object of DatePicker WPF
Check to make sure your Windows regional settings are set to a 24hr clock. I'm guessing its returning 12AM

Date type in MySql

I'm new to MySQL and C#.
I stored certain values in a column with data type Date. I did not want the time, only the date to be stored.
On viewing these values using phpMyAdmin or MySql command line, I see them in the format:
YYYY-MM-DD
However, when I retrieve these values in to my web application, they are displayed in the following format:
YYYY-MM-DD HH:MM (the time is specifically 12:00).
Why does this happen? And how can I prevent this from happening?
when you store in C# your date field, you use DateTime object. In this object when you don't specify the time part will be put a default value depends on Globalization.
You can study how DateTime works here
You can convert the date to the format you like when you fetch the data, using date_format():
select date_format(datecol, '%Y-%m-%d')
This returns the value as a string.
You shouldn't retrieve the value as a string from mysql. Why? Because if you ever need to do any operations on that value, such as adding a day, then you will need to parse it back into a DateTime again. String parsing can be slow, and when it comes to dates they are prone to errors like misinterpretation of mm/dd/yyyy and dd/mm/yyyy formatting.
The problem you have is that .NET does not have just a Date type. It only has a DateTime type. So loading a MySQL DATE type, is going to get a DateTime with the time portion set to midnight.
There's no direct problem with that, except on how are outputting the result. If you just call .ToString() without any parameters, or you implicitly use it as a string, then you are going to get a result with the full date and time. You simply need to provide a parameter to indicate what formatting you want.
Without any parameters, you are getting the General "G" format. This is explained in the documentation here.
In other words:
yourDateTime.ToString() == yourDateTime.ToString("G")
You can read about all of the other formats available, here and here.
In particular, if you just want the date, then you probably want to do this:
yourDateTime.ToString("d")
Based on your comments, you should be doing this instead:
MySQL Query:
SELECT Gbstartdate FROM TblGbDef
C#:
DateTime gb_start_date = (DateTime) datareader[0];

Convert 2012-06-28T14:30:00-04:00 to yyyyMMddTHHmm format in C#

I want to convert a date in c# like 2012-06-28T14:30:00-04:00 in to "yyyyMMddTHHmm" format both dates are in string.
string currentDate="2012-06-28T14:30:00-04:00";
string requiredDate="yyyyMMddTHHmm"
When i am trying to convert this date with Convert.ToDateTime() then C# return "20120629T0000-04:00" but this is not correct date.
Have a look at the Standard Date and Time Format Strings (MSDN). I guess it might be enough to use just the ToString() method on your DateTime instances.
Possibly you might need to specify CultureInfo (MSDN here) in the appropriate overloads of the convert methods. Possibly the server and client applications are in different cultures and/or timezones.
DateTime.Parse("2012-06-28T14:30:00-04:00").ToString("yyyyMMddTHHmm") produces value you may want.
Note that changing value from absolute ISO8601 format to local ISO8601 format should be done carefully as it changes meaning of the value and often value itself.
Please make sure which of the following options you really want (and adjust code accordingly):
simply drop time from the value. Will produce semi-random time if values are coming from different time-zones.
always move value to a given timezone and make it local to that timezone.
always move value to current timezone and make it local to current timezone
Or maybe you are looking for something else altogether.
I'm not sure this is the format you are trying out
string currentDate="2012-06-28T14:30:00-04:00";
DateTime.Parse(currentDate).ToString("o")
This will give you 2012-06-29T00:00:00.0000000+05:30

Dateformat with nullable variable

I have this code:
startWeekDate = startWeekDate == null ? DateTimeHelpers.calcMondayDate(DateTime.Now) : DateTimeHelpers.calcMondayDate(startWeekDate.Value);
DateTime endWeekDate = startWeekDate.Value.AddDays(6);
startWeekDate is a parameter that is nullable. This works good, but I want to format it with: String.Format("{d:0}", .... ) but when I slap that around it I get error.
Cannot implicitly convert type 'string' to 'System.DateTime?
How shall I fix this problem?
/M
EDIT:
I'm trying to add this to the function instead, since it should always return dateformat without clock, but I get same error there with this code:
public static DateTime calcMondayDate(DateTime input)
{
int delta = DayOfWeek.Monday - input.DayOfWeek;
DateTime monday = String.Format("{d:0}", input.AddDays(delta));
return monday;
}
Cannot implicitly convert type 'string' to 'System.DateTime'
hmm, but input is DateTime, why does it complain about it being string?
You've shown the code that doesn't have a problem, but not the code that does have a problem. Please show the code which doesn't compile. It sounds like you're trying to assign a DateTime? variable a string value, e.g.
startWeekDate = string.Format(...);
That's definitely not going to work. What would you really want it to do with the formatted value once you've got it as a string? Use it where you want a string, not where you want a DateTime?.
One thing to add - your first line can be expressed more simply:
startWeekDate = DateTimeHelpers.calcMondayDate(startWeekDate ?? DateTime.Now);
EDIT: Now you've posted your code, it's clear why it's not working - as suspected, you're trying to assign a string value to a DateTime variable.
DateTime values don't have a format. They're like numbers - they have a value which isn't inherently formatted. It's like 0x10 and 16 are the same number, just written differently.
Now it sounds like you're just trying to return the date without the time - which is better done as:
return input.AddDays(delta).Date;
The Date property returns a DateTime with the same date, but midnight as the time.
On a side note, it's a shame that .NET has such a restricted set of date/time types, so that you can't really represent the idea of a time-less date. I'm trying to fix this situation, but it'll be a while before it bears fruit...
The error is "cannot convert string to DateTime".
Whch is exactly what this line is attempting to do:
DateTime monday = String.Format("{d:0}", input.AddDays(delta));
As I said in my comment above, you format at output time. Internally a datetime is just a number, it has no concept of format. You should simply return the input.AddDays(delta)
You get the compilation error because you have declared startWeekDate as a DateTime, but string.Format returns a string. One possible remedy is to change the declaration:
string endWeekDate = string.Format("{d:0}", startWeekDate.Value.AddDays(6));
However, now endWeekDate is a string, so you migh want to change the code a bit to keep it as is, and then introduce a new variable which is the string representation of that variable. Whether or not that is a good idea depends on the context.

Storing a short date in a DateTime object

I'm trying to store a shortened date (mm/dd/yyyy) into a DateTime object. The following code below is what I am currently trying to do; this includes the time (12:00:00 AM) which I do not want :(
DateTime goodDateHolder = Convert.ToDateTime(DateTime.Now.ToShortDateString());
Result will be 10/19/2009 12:00:00 AM
DateTime is an integer interpreted to represent both parts of DateTime (ie: date and time). You will always have both date and time in DateTime. Sorry, there's nothing you can do about it.
You can use .Date to get the date part. In these cases, the time will always be 12:00 but you can just ignore that part if you don't want it.
You only have two options in this situation.
1) Ignore the time part of the value.
2) Create a wrapper class.
Personally, I am inclined to use option 1.
A DateTime will always have a time component - even if it is 12:00:00 AM. You just need to format the DateTime when you display it (e.g. goodDateHolder.ToShortDateString()).
Instead of .Now you can use .Today which will not remove the time part, but will only fill the date part and leave time to the default value.
Later on, as others pointed out, you should try to get the date part ignoring the time part, depending on the situation.
You'll always get the time portion in a DateTime type.
DateTime goodDateHolder = Convert.ToDateTime(DateTime.Now.ToShortDateString());
will give you today's date but will always show the time to be midnight.
If you're worried about formatting then you would try something like this
goodDateHolder.ToString("mm/dd/yyyy")
to get the date in the format that you want.
This is a good resource msdn-dateformat
You can also check out Noda Time based off the Java Joda Time library.
DateTime object stores both the date and the time. To display only the date, you would use the DateTime.ToString(string) method.
DateTime goodDateHolder = DateTime.Now;
// outputs 10/19/2009
Console.WriteLine(goodDateHolder.ToString("MM/dd/yyyy"));
For more information on the ToString method, follow this link
You might not be able to get it as a DateTime object...but when you want to display it you can format it in the way you want by doing something like.
myDateTime.ToString("M/d/yyyy") which gives 10/19/2009 for your example.
DateTime is merely a UInt64 with useful and clever formatting wrapped around it to make it appear like a date plus a time. You cannot eliminate the time element.

Categories