Converting DateTime [duplicate] - c#

This question already has answers here:
Closed 10 years ago.
Possible Duplicate:
How to convert DateTime object to dd/mm/yyyy in C#?
I'm new to c# and was hoping someone could help me clean up some code.
I have the following method which converts a DateTime to a custom Event string e.g. 30th of Jan 2012 is converted to 201201 (ignores the day)
public ConvertToEventDate(DateTime date)
{
var year = date.Year.ToString();
var month = date.Month.ToString();
month = month.Length == 2 ? month : "0" + month;
return year + month;
}
I was wondering if there is a better way of doing this conversion.

I'd do this;
public string ConvertToEventDate(DateTime date)
{
return date.ToString("yyyyMM");
}
you can also put this into an Extension method like this;
public static class ExtenstionMethods
{
public static string ToEventDate(this DateTime date)
{
return date.ToString("yyyyMM");
}
}
and then call it ike this;
DateTime date = new DateTime(2012, 30, 1);
date.ToEventDate();
as opposed to this;
ConvertToEventDate(date);

public string ConvertToEventDate(DateTime date)
{
return date.ToString("yyyyMM", CultureInfo.InvariantCulture);
}
Have a look at the custom formatting strings docs

Others have suggested ToString("yyyyMM") which is basically there - but I would suggest you probably want to specify the invariant culture. Otherwise if the thread's current culture uses a non-Gregorian calendar, you could end up with a month/year you're not expecting. So I'd use:
string text = date.ToString("yyyyMM", CultureInfo.InvariantCulture);
See the documentation for custom date and time format strings for more information if you want to change the exact format later.

Try
return date.ToString("yyyyMM");

Related

Invert position of time and date [duplicate]

This question already has answers here:
Convert System DateTime to specific format. eg:(yyyyMMdd hh:MM:ss)
(5 answers)
Closed 2 years ago.
If I have a datetime standard (dd/MM/yyyy hh:mm:ss) is there a possible to invert position of time and date and get hh:mm:ss dd/MM/yyyy ?
I tried
var tempDate = date.ToString("hh:mm:ss dd/MM/yyyy");
date = Convert.ToDateTime(tempDate);
But I keep get the date in first format (dd/MM/yyyy hh:mm:ss).
New Info
As per conversation with the OP, the motivation here is that the date needs to be displayed in the grid in the specific format. The model that contains DateTime Property is part of the list. Question is, "How to make date appear in the specific format in the grid?"
Lets walk this one. Here you have a date you presenting as a string in a specific format
var tempDate = date.ToString("hh:mm:ss dd/MM/yyyy");
This, I am not sure why it is working for you at all without supplying Format Provider
date = Convert.ToDateTime(tempDate);
This program did not work for me (as expected!) because the culture of my thread (format provider) does not have parsing mechanism to such string as I receive from the line 1
var tempDate = DateTime.Now.ToString("hh:mm:ss dd/MM/yyyy");
Console.WriteLine(tempDate); // Prints the date
var date = Convert.ToDateTime(tempDate); //ERROR !!!
Console.WriteLine(date);
DateTime is not stored in any specific format. It is a special data type. What you see on the screen is a string representation of this type. Here Console.WriteLine(date);, as example, date being converted to a string using its internal logic in default ToString() implementation, using current thread's culture. Or you can use ToString(...) parameterized overloads to get out a specific format, e.g. "hh:mm:ss dd/MM/yyyy". But storing this format in DateTime is not possible. Format comes from the culture, which your thread currently is set with, unless you specify it. You can try to change culture on the thread and you will see different results from ToString() for each culture.
To Answer the question as it came up from conversation with OP, you can do the following
// imagine this is as original model
public class DataModel
{
// Other propertues here
public DateTime DateProperty { get; set; }
}
// create display model
public class DisplayModel
{
privvate const string _format = "hh:mm:ss dd/MM/yyyy";
private DataModel _dataModel;
public DisplayModel(DataModel dataModel)
{
_dataModel = dataModel;
}
// Wraps date time and
public string DateProperty { get { return _dataModel.ToString(_format); } }
// other properties here
}
This is possible general approach for whatever UI needs. However, if the grid you've mentioned is DataGridView, even simpler approach would be is to set a property on the grid
dataGrid.Columns[0].DefaultCellStyle.Format = "hh:mm:ss dd/MM/yyyy";

c# creating datetime object without time [duplicate]

This question already has answers here:
How to remove time portion of date in C# in DateTime object only?
(43 answers)
Closed 6 years ago.
I am trying to load some dates from a database, but i dont want to create a datetime object with time, i only want the date. I have tried with
var date = value.Date; it doesn't work. I have seen a lot of methods that basically format the date to show it as a string and i don't want to do that, because than i have to load all the data into the grid manually. I hope someone can help me. Here is the code
DateTime startDate = (DateTime)row["Course_StartDate"];
DateTime endDate = (DateTime)row["Course_EndDate"];
Do you need to use any of the functionality of DateTime, such as comparing dates or adding/subtracting days from a date? If not, you can probably just make your variables strings instead of DateTimes:
string startDate = ((DateTime)row["Course_StartDate"]).ToShortDateString();
string endDate = ((DateTime)row["Course_EndDate"]).ToShortDateString();
Edit: Since you do need to compare times, you could use a second property that returns the equivalent value as you need it:
DateTime startDate = new DateTime();
DateTime endDate = new DateTime();
string startDateString
{
get
{
return startDate.ToShortDateString();
}
}
string endDateString
{
get
{
return endDate.ToShortDateString();
}
}
private void LoadMethod()
{
startDate = (DateTime)row["Course_StartDate"];
endDate = (DateTime)row["Course_EndDate"];
}
Then you can do your math with the DateTime objects, and use the string objects in your table.
If you are talking about DataGridView, change the Column Format (DefaultCellStyle > Format) to MM/dd/yyyy

String date to DayOfWeek [duplicate]

This question already has answers here:
Parse string to DateTime in C#
(9 answers)
Closed 8 years ago.
This code is a simplified version of what I'm trying to do:
this.dateValue = "8/12/2005";
return DateTime.dateValue.DayOfWeek.ToString();
I want to use my dateValue in stead of 'NOW'
Use DateTime.TryParseExact
this.dateValue = "8/12/2005";
DateTime dt;
// assuming the expected date is the 8th of Dec 2005, otherwise use m/d/yyyy
if (DateTime.TryParseExact(this.dateValue, "d/m/yyyy", CulterInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
return dt.DayOfWeek.ToString();
}
else
{
return null;
}
The DateTime.Now property returns a DateTime, DayOfWeek is a property of DateTime so you can simply do
return DateTime.Now.DayOfWeek.ToString();
To get the text version of the current Day of the Week
If you want to reverse this you can parse a new DateTime from the string.
return DateTime.Parse("8/12/2005").DayOfWeek.ToString();
Watch our for strings which can't be parsed. You may want to look into the TryParse method.

Get only the Date without Time from DateTime

i came across a situation that, i need to get only the Date out from DateTime.
i am having a DateTime? StartDate property (Nullable) used to hold the date value
i tried below,
var d = Convert.ToDateTime(StartDate).Date;
but its returning me d as eg. 6/22/2006 12:00:00AM
after doing var d = Convert.ToDateTime(StartDate).Date.ToString("d");
i'm able to get d as 6/22/2006..but i dont want to convert my DateTime? to String
is their any way to get only the Date without using the ToString("d")?
Use the Date property to get the Date component of DateTime instance:
DateTime dateTimeNow = DateTime.Now;
DateTime datePartOnly = dateTimeNow.Date; // Return 00/00/0000 00:00:00
With this approach, Date property will return the date at midnight. So the time part will be 00:00:00 in this case.
There are couple of alternate ways to get the just the Date part, but the return type of it will be a string:
1.) Using .ToString(string? format) where format can be standard or custom format string
string dateOnlyString = dateTimeNow.ToString("dd/MM/yyyy");
//Can also use .ToString("dd-MM-yyyy");
2.) Using .ToShortDateString() to return a culture sensitive date string
string dateOnlyString = dateTimeNow.ToShortDateString();
//Returns M/d/yyyy for "en-US" culture
//Returns yyyy/M/d for "ja-JP" culture
Reference: here.
try this:
string x = DateTime.Now.ToShortDateString().
this will get the date dd/mm/yy given to the string x.
I think you question is sort of... moot.
You ask for a date without a time, but get a DateTime, which has both. I really don't think that should be a problem in most cases though:
If you create a DateTime with a certain date, and compare it to another date, and both of these have their time set to midnight, your comparisons will be valid and correct. Eg:
var yesterday = new DateTime(2014, 3, 10);
var today = new DateTime(2014, 3, 11);
var tomorrow = new DateTime(2014, 3, 12);
Comparing and sorting these will work as you expect, and so will the following:
if(today == DateTime.Today){
Console.WriteLine("Today is the day!");
}
In other words, you should be perfectly fine just pretending like the time-part does not exist.
Also, as you touched upon yourself in the OP, you can use the property Date if you want to make sure to avoid any time-component:
// Note the addition of hours, minutes and seconds:
var today = new DateTime(2014, 3, 11, 14, 35, 33);
if(today == DateTime.Today){
Console.WriteLine("This never happened...");
}
if(today.Date == DateTime.Today){
Console.WriteLine("...But today is still the day!");
}
In C# 10 you can use DateOnly.
DateOnly date = DateOnly.FromDateTime(DateTime.Now);
A DateTime does have both a date and a time. You can decide with yourself that in a specific property you well never use the date part. It will just be 12:00 AM, but you won't use it.
In some situations it can be useful to write your own type that can never hold a time-of-day component. Here is a start:
struct Date : IFormattable
{
readonly DateTime value;
public Date(DateTime dateAndTime)
{
value = dateAndTime.Date;
}
public string ToString(string format, IFormatProvider formatProvider)
{
return value.ToString(format ?? "d", formatProvider);
}
public string ToString(string format)
{
return ToString(format, null);
}
public string ToString(IFormatProvider formatProvider)
{
return ToString(null, formatProvider);
}
public override string ToString()
{
return ToString(null, null);
}
public static implicit operator DateTime(Date date)
{
return date.value;
}
}
The field value does hold the 12 AM thing, but it is private and is not seen from the outside. The overloads of ToString() make sure that unless something else is requested, the Date is written out with the short date format of the current culture.

Empty datetime in the report

I face the following problem :
Sometimes the value of my trans_in(DateTime) in my database is :1900-01-01 00:00:00.000
and it appears in my telerik report like this 12:00 AM i want to show the textbox empty instead so i create the following custom method :
public static string NotAttend(DateTime trans_in)
{
if (trans_in == null || trans_in.ToString().Trim() == "1900-01-01 00:00:00.000")
{
return string.Empty;
}
else
return trans_in.ToShortTimeString();
}
and bind the textbox like this :
= OvertimeReports.CustomExpressions.NotAttend(Fields.trans_in)
but this didn't fix my problem still appear 12:00 AM !!
Your trans_in.ToString() would return you the string representation of your DateTime object based on your current culture, its better if you check your DateTime like:
public static string NotAttend(DateTime trans_in)
{
if(trans_in == new DateTime(1900, 1, 1))
{
return string.Empty;
}
else
return trans_in.ToShortTimeString();
}
Try to compare the trans_in with default(new DateTime())
You shouldn't compare a date with a String without formatting it
reference:
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/d0f4578c-0585-4f38-95be-569a90ebeb21/
edit: i'm seeing here you'd best compare with DateTime.MinValue
Determining whether the new date is the default new DateTime() or not
You can provide a format to your DateTime by using overridden function of DateTime.ToString(). HH means time in 24 HRS where hh means 12 HRS format :
public static string NotAttend(DateTime trans_in)
{
if (trans_in == null ||
trans_in.ToString("yyyy-MM-dd HH:mm:ss.fff") == "1900-01-01 00:00:00.000")
{
return string.Empty;
}
else
return trans_in.ToShortTimeString();
}
The problem what you have here is more of a formatting issue with the .ToString conversion
Try using the specific format you need in the .ToString overload for this
trans_in("yyyy-M-d HH:mm:ss.fff")
So in this HH case you would have it as 00:00 instead of 12:00
A better way would be to compare it as DateTime make a DateTime obj for 1900-1-1 then compare it with trans_in.Date part which would not involve this string formatting issues

Categories