A Datetime without time without string.format - c#

I have a DataTable coming from a stored procedure which I'm writing to an excel file. There's a column with a DateTime datatype, and looking at the values in there, they're just generic dates with the time stamp.
I've tried using the DateTime.Date property, but that still gives me a time stamp. Further, I've tried to create a new DateTime object using the year,month,day constructor but it still adds a time stamp:
DateTime newDate = DateTime(oldDate.Year, oldDate.Month, oldDate.Day);
I'm trying to keep the column datatype to DateTime but remove the time stamp, so this rules out ToString("") formatting. Is there another way?

A DateTime always contains a date and a time portion. If you use the Date property it returns a new DateTime where the time is 0:00:00 so midnight at the same day. You want a string representation of the datetime without the time.
You can use DateTime.ToString:
string result = oldDate.ToString("d"); // uses current culture's date format
or
string result = oldDate.ToShortDateString(); // same as above
or
string result = oldDate.ToString("MM-dd-yyyy"); // custom format
Edit: "so this rules out ToString("") formatting. Is there another way?"
No, because of the reason mentioned above.
It's important to separate the data from how it is displayed. If you need to display it without time use the code above, you can store the original DateTime variable for future processing, select it again from database or use DateTime.Parse/DateTime.ParseExcact to get a DateTime from the string.

The 'problem' is that there is no Date struct in .NET, you only have a DateTime struct. That will always contain both date and time. You can only format it as date.
Or, you could of course write your own struct containing only the date part, or give up and use string.Format to format it as a date (possibly using the short date string d).

If you mean time part with timestamp, a DateTime instance always have both date and time part. DateTime.Date property just sets the time value set to midnight.
You can get it's string representation if you want only it's Date part. You can get standard date and time format or custom date and time format with DateTime.ToString() method.
Usually, you can use ShortDatePattern to get only string representation of Date part which uses standard "d" format of your CurrentCulture.
DateTime.Now.ToString("d");
There is a proposal for System.Date and System.Time types for .NET Framework in dotnet/corefx on GitHub page by the way.
Proposal: System.Date type

You should use DateTime.Now.ToShortDateString();

Related

C# Datarow item DateTime format being ignored

I am filling a DataTable using the results of a SQL SP. One of the columns is a DateTime type. When I try to format the DateTime value, it seems to be ignored.
For example:
foreach (DataRow row in sourceTable.Rows)
{
row["DateOfActivity"] = Convert.ToString(((DateTime)row["DateOfActivity"]).ToString("yyyy-MM-dd"));
Console.WriteLine(row["DateOfActivity"]);
}
Results in:
2/17/2016 12:00:00 AM
How can I make sure the DateTime format is retained?
In a databable, columns have specific types. When you assign back to row["DateOfActivity"], you're assigning to a DateTime value. Writing that back to the console will give you the default .ToString() call.
The solution is to wait to format the output until you actually show it to the user. Get rid of the first line inside the loop completely and have the second line just look like this:
Console.WriteLine(row["DateOfActivity"].ToString("yyyy-MM-dd"));
The type definition of the row["DateOfActivity"] column is not present in your question, however I am going to assume it is defined as a DateTime type. This type definition stores the raw date/time value, without a format.
From MSDN:
Internally, all DateTime values are represented as the number of ticks (the number of 100-nanosecond intervals) that have elapsed since 12:00:00 midnight, January 1, 0001. The actual DateTime value is independent of the way in which that value appears when displayed in a user interface element or when written to a file. The appearance of a DateTime value is the result of a formatting operation. Formatting is the process of converting a value to its string representation.
Because the appearance of date and time values is dependent on such factors as culture, international standards, application requirements, and personal preference, the DateTime structure offers a great deal of flexibility in formatting date and time values through the overloads of its ToString method. The default DateTime.ToString() method returns the string representation of a date and time value using the current culture's short date and long time pattern. The following example uses the default DateTime.ToString() method to display the date and time using the short date and long time pattern for the en-US culture, the current culture on the computer on which the example was run.
You should be formatting the value of a DateTime type when you output it. If you want to store a formatted version of this value in your DataTable you will need to define the column as a string and then store the formatted value.
For more information see this link on the DateTime type.

remove time from date and print only date in datetime format

i have date stored in a string format as follows: "2014-03-12"
im passing this to a database which accepts the date as datetime.
im converting the string date to datetime format as follows:
DateTime StartDates = Convert.ToDateTime(StartDate);
but the time gets appended along with the date as "2014-03-12 12:00:00:00"
can anyone tel me how to send only the date leaving out the time.
i want the final date to be still in datetime format only but with time part cut off
DateTime is irrespective of the format. Formatting is only useful for presentation purpose. A DateTime object will have a Date part and Time part. When you try parsing your string "2014-03-12", it doesn't have a Time part, so in the parsed object, Time is set to 00:00:00.
If you just want to to display date then you can use DateTime.ToShortDateString method or use a custom format like:
string formattedDateString = StartDates.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
If you're happy with the date part, you may simply return the Date property of the DateTime conversion result:
DateTime StartDates = Convert.ToDateTime(StartDate).Date;
I should mention that using Convert.ToDateTime puts you at the mercy of the process current culture date format though, so you probably want to use the ParseExact or ToString method like the other answers suggests, with the appropriate format and culture instance.

C# - Date/Time Formatting

Using C#, I am trying to format a date in to the following string format:
YYYYMMDD_HHMM.xlsx
Here is my code:
DateTime.Today.AddDays(0).ToString("yyyymmdd") + "_" + DateTime.Today.AddDays(0).ToString("hhmm")
Here is my output:
20130027_1200.xlsx
Month is not correct, nor is the time.
You're using mm, which is minutes, not months - and you're trying to print the time using DateTime.Today, which always returns midnight at the start of the day.
It's not clear why you're adding 0 days, either. I'd use:
DateTime now = DateTime.Now;
string name = now.ToString("yyyyMMdd'_'HHmm'.xlsx'");
(The ' quoting for the _ isn't strictly necessary, but personally I find it simplest to take the approach of quoting everything that isn't a format specifier.)
Or:
DateTime now = DateTime.Now;
string name = string.Format("{0:yyyyMMdd}_{0:HHmm}.xlsx", now);
Note the use of HH instead of hh to get a 24-hour clock rather than 12-hour, too.
Additionally, consider using UtcNow instead of Now, depending on your requirements. Note that around daylight saving transitions, the clock will go back or forward, so you could end up with duplicate file names.
Also note how in my code I've used DateTime.Now once - with your original code, you were finding the current date twice, which could have given different results on each invocation.
Finally, you might also want to specify CultureInfo.InvariantCulture when you format the date/time - otherwise if the current culture is one which doesn't use a Gregorian calendar by default, you may not get the results you were expecting.
DateTime.Today returns DateTime with all time-related properties set to 0. Use DateTime.Now instead.
Property value
An object that is set to today's date, with the time component set to 00:00:00.
from DateTime.Today Property
Use MM in your format to get month. mm returns minutes. You can check all format specifiers on MSDN: Custom Date and Time Format Strings

A type to create DateTime Object in particular format in C#.NET

In my project, I am in need of creating a DateTime object in below format.
"MM/dd/yy hh:mm tt" (without seconds and the year in two digit format)
When I am creating a date time object with a string (like "7/12/12 04:50 AM"), the created date time object is in the format of complete date time structure. (7/12/2012 04:50:00 AM)
Is there any way to create date time object (not string format) in particular format?
No, It has predefined date and time value (such as the year, month, and day, or the number of ticks).
There is no way other than converting it in string with the format you are in need of.
DateTime dat1 = new DateTime();
// The following method call displays 1/1/0001 12:00:00 AM.
It uses the default DateTime.ToString() method to display the date and time using the short date and long time patterns.
The DateTime object does not have any format. It has members and those members will have values. If you don't supply those values, they will be 0. The only way you can hide them is to format the DateTime object to a String where those values will not be shown. But in the DateTime object itself, they will still exist.
No, the DateTime object stores a date and time in a predetermined format.
What you are trying to do really should be done when displaying the date.
Perhaps if you explain the real problem you're trying to solve, someone can suggested a better alternative.
you can try by converting this to string and give your specified format as follows:
datetime dt=new datetime();
string dateval=dt.tostring("MM/dd/yy hh:mm tt")
thanks.

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