How to get date after 12 months in c# - c#

I have been given a task to get future date. I mean if today is 1/1/2016 (1st Jan,2016) and when i add 12 months to it then normally it gives 1/1/2017 if i do like this code :
dateTimeObj="1/1/2016"
string futureDate=dateTimeObj.AddMonth(12);
Now this future date will give 1/1/2017 using this code but i have been asked to get when we add 12 months then it must give 12/31/2016 (31 dec,2016) (not 1/1/2017)
How to achieve this ? Is there any inbuilt function to do this, If not then how to do it programtically?
Note: The software on which i am coding is for accounts, they need the date this way only.

I think you should do this
dateTimeObj.AddYears(1).AddDays(-1);

I think there is no special Feature. Just so something like this:
date.AddMonths(12).AddDays(-1);
best regards

When adding 12 months to today, the expected result is same date in next year. So what you have to do is subtract a timespan of one day from it. You can try the above methods in the comments or you can follow this.
This is giving the expected result as 12-31-2016
var dateTimeString = "1/1/2016";
DateTime dateTimeObj = DateTime.Parse(dateTimeString);
DateTime futureDate = dateTimeObj.AddMonths(12).Subtract(TimeSpan.FromDays(1));
Console.WriteLine(futureDate.ToString("MM/dd/yyyy"));
Console.ReadLine();

Related

Convert to DateTime from two string variables in C#

I want to convert two string variables to a DateTime variable.
So something like this...
string day = "05";
string month = "11";
Convert.ToDateTime(day + month + "0000");
This will then be uploaded to a SQL server smalldatetime datatype.
Is there any way to do this? I've seen some people use ParseExact but they use it with a perfect date format, never creating it from two strings like I want to do. Does anyone know how to do this?
You can try this:
string day = "05";
string month = "11";
string year = "0001";
DateTime dt =
DateTime.ParseExact(day + "-" + month + "-" + year, "dd-MM-yyyy", CultureInfo.InvariantCulture);
But year must not be 0.
'0001' year represent first year only. so you can say 0 years has been passed till this date.
UPDATE
as jimi mentioned below
smalldatetime goes from 1900-01-01 to 2079-06-06. The OP will have to safe-check this range before converting.
you would have to be careful while parsing string into Date, if you are going with smalldatetime, you are limited with range of "1900-01-01 to 2079-06-06" so your DateTime cannot have year 0001 at that time.
The day and month only matter as it represents when a school year ends, the application I'm making will take the month and day.
If you are not using any specific year, don't use a date time type!
The dateTime format will need a year, as already stated, and using a fake one will just convey a lot of false information with it (for instance, the day of week, Monday, Tuesday, ...). Of course you don't want to use it, and you probably won't, but you could be victim of some display bug and other unwanted consequences.
I'd suggest you simply use two integer fields, one for the day and one one for the month.
For validation purpose, you could internally use some dateTime following the other accepted answer for instance. That would be one way to prevent "31st April".
But I recommend you to avoid storing a fake year in your db, along with a complicated type, that could cause you more trouble than needed in the long run.
On the other hand, if your app is supposed to refer to the current year or other specific, then use it, don't fake it either !

Get week number and year as YYYYWW from current date (SSIS script task) plus N weeks in the future

I have seen this answer which explains how I might get the relevant week number.
Does anyone know how I could change the format to Year and Week like this YYYYWW i.e. 201317.
Based on it being week 17, how could I get the correct Year and Week in N weeks time? i.e. 60 weeks from the current week including the current week? but as YYYYWW with the correct Year and Week number in that given year?
I am trying to do this in a script component of an SSIS package 2008 which supports up to .NET 3.5.
I have also tried referencing NodaTime in a Script Task inside the package and I can reference it fine and build the script, but when it comes to executing the task just on my machine, I get a FileNotFound Exception for NodaTime.dll.
Any help trying to achieve this just using .NET 3.5 and C# would be appreciated.
UPDATE: Here is an example of some of the week data I have recently been given. I didn't know my exact requirement and I still don't really know. This looks to me like the weeks start on a Sunday and that there is no leap week at the end of this year. I can only guess at whether this is the Gregorian calendar or a modification of it.
There's a very simple method to calculate the current week using System.Globalization.CultureInfo:
using System.Globalization;
CalendarWeekRule weekRule = CalendarWeekRule.FirstFourDayWeek;
DayOfWeek firstWeekDay = DayOfWeek.Monday;
Calendar calendar = System.Threading.Thread.CurrentThread.CurrentCulture.Calendar;
int currentWeek = calendar.GetWeekOfYear(DateTime.Now, weekRule, firstWeekDay)
The above method will almost (see Jon Skeet's linked article) return the ISO 8601 week date; this is the standard used by many governments and industries (including import/export, and multi-national companies).
In order to get the desired format of YYYYWW, simply use:
String myYYYYWW = String.Format("{0:0000}{1:00}", DateTime.Now.Year, currentWeek);
To obtain N weeks in the future, you can let the DateTime class do the calculation for you...
DateTime myFutureWeek = DateTime.Now.AddDays(N * 7); // add N weeks
// ... steps outlined above ...
int futureWeek = calendar.GetWeekOfYear(myFutureWeek, weekRule, firstWeekDay)
If you'd like to deviate from the almost-ISO week number, simply change the weekRule and firstWeekDay variables. You may also want to play around with the calendar of specific cultures.
The Wikipedia article on ISO week date, contains a section for other week numbering systems, such as that used in the United States.

Compare date less than 3 months

I need to compare whether date is less than 3 months old.
I will get installation date:
DateTime installdate=DateTime.Parse("1/5/2012 8:12:14 PM");
if ((installdate<DateTime.Now.AddMonths(-3)))
{
// do something
}
Is this the best way to compare the dates?
Thanks.
A few things to think about:
"Is date x earlier than 3 months before today" isn't the same as "today is more than 3 months later than date x"; you'll need to make sure you have the exact semantics you want.
Consider what you want to do with the time component - are you interested in dates or dates and times? (Would you expect the condition evaluation to change based on the current time of day?)
Consider time zones: are you interested in "today in the system's current time zone" or some fixed time zone?
Depending on the source of the text data, you should possibly use DateTime.TryParse and you should possibly use DateTime.ParseExact or DateTime.TryParseExact, passing in the expected format (and culture)
Basically, there are various corner cases around date and time behaviour - you should explicitly think about all of these things (some of which are forced upon you if you use Noda Time instead of DateTime, btw :)
Regarding the first point, if the idea is that you get a trial period of three months from the installation date (or something similar), that suggests you should be adding three months to that instead.
I'd also change the variable name and get rid of the redundant parentheses, by the way:
DateTime installationDate = DateTime.Parse("1/5/2012 8:12:14 PM");
DateTime trialPeriodEnd = installationDate.AddMonths(3);
if (trialPeriodEnd > DateTime.Now)
{
// do something
}
Assuming you're storing the installation date yourself somewhere, I would try to store it in some form which is less ambiguous - possibly even storing just a "ticks" value instead of a string. But assuming you are storing it yourself, you shouldn't need to use TryParse - it makes sense to go "bang" if you can't parse the value. I'd use ParseExact, probably with a standard format specifier of "o" (round trip).
DateTime installdate ;
if (DateTime.TryParse("1/5/2012 8:12:14 PM", out installdate))
{
if ((installdate < DateTime.Now.AddMonths(-3))) { }
}
Tryparse is used so as to validate if the date passed in the parameter is valid or invalid

Difference between 2 DateTimes in Hours? [duplicate]

This question already has answers here:
Closed 11 years ago.
Possible Duplicate:
Showing Difference between two datetime values in hours
Hi,
is there an easy way to get the difference between 2 DateTime-Values in Hours?
I know, its a possibility to calculate itself by get for each day difference 24h, for each month 188h and so on... but is there an easy way given mybe?
Example:
1) 01.02.2010 12:00
2) 03.03.2011 14:00
= ? Hours differnce
It's pretty simple:
TimeSpan diff = secondDate - firstDate;
double hours = diff.TotalHours;
Note that if these DateTime values have been taken locally, the results may not be the number of elapsed hours. For example, you could have one DateTime of midnight and one of 2am, but only one hour had elapsed - because the clocks went forward at 1am. This may or may not be an issue for you. It won't be a problem if you're dealing with UTC DateTime values.
(dateTime1-dateTime2).TotalHours will give a double with the total difference in hours between the two.
date1.Subtract(date2).TotalHours
TimeSpan difference = firstDateTime - secondDateTime;
double diffInHours = difference.TotalHours
DateTime.Subtract(DateTime) will return a TimeSpan that has a TotalHours property.

How to get only time from date-time C# [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
Suppose I have the value 6/22/2009 10:00:00 AM. How do I get only 10:00 Am from this date time.
You have many options for this:
DateTime dt = DateTime.Parse("6/22/2009 07:00:00 AM");
dt.ToString("HH:mm"); // 07:00 // 24 hour clock // hour is always 2 digits
dt.ToString("hh:mm tt"); // 07:00 AM // 12 hour clock // hour is always 2 digits
dt.ToString("H:mm"); // 7:00 // 24 hour clock
dt.ToString("h:mm tt"); // 7:00 AM // 12 hour clock
Helpful Link:
DateTime.ToString() Patterns
From a DateTime, you can use .TimeOfDay - but that gives you a TimeSpan representing the time into the day (10 hours).
There is only DateTime type in C# and it consist of both the date and time portion. If you don't care about the Date portion of DateTime, set it to default value like this:
DateTime myTime = default(DateTime).Add(myDateTime.TimeOfDay)
This way you can be consistent across all versions of .NET, even if Microsoft decides to change the base date to something else than 1/1/0001.
You might want to look into the DateTime.ToShortTimeString() method.
Also, there many other methods and properties on the DateTime object that can help you in formating the date or time in any way you like. Just take a look at the documentation.
Try this:
TimeSpan TodayTime = DateTime.Now.TimeOfDay;
DateTime now = DateTime.Now;
now.ToLongDateString(); // Wednesday, January 2, 2019
now.ToLongTimeString(); // 2:33:59 PM
now.ToShortDateString(); // 1/2/2019
now.ToShortTimeString(); // 2:16 PM
now.ToString(); // 1/2/2019 2:33:59 PM
There are different ways to do so. You can use DateTime.Now.ToLongTimeString() which
returns only the time in string format.
You can simply write
string time = dateTimeObect.ToString("HH:mm");
You can use this
lblTime.Text = DateTime.Now.TimeOfDay.ToString();
It is realtime with milliseconds value and it sets to time only.
This works for me. I discovered it when I had to work with DateTime.Date to get only the date part.
var wholeDate = DateTime.Parse("6/22/2009 10:00:00 AM");
var time = wholeDate - wholeDate.Date;
You can use ToString("T") for long time or ToString("t") for short time.
If you're looking to compare times, and not the dates, you could just have a standard comparison date, or match to the date you're using, as in...
DateTime time = DateTime.Parse("6/22/2009 10:00AM");
DateTime compare = DateTime.Parse(time.ToShortDateString() + " 2:00PM");
bool greater = (time > compare);
There may be better ways to to this, but keeps your dates matching.
if you are using gridview then you can show only the time with DataFormatString="{0:t}"
example:
By bind the value:-
<asp:Label ID="lblreg" runat="server" Text='<%#Eval("Registration_Time ", "{0:t}") %>'></asp:Label>
By bound filed:-
<asp:BoundField DataField=" Registration_Time" HeaderText="Brithday" SortExpression=" Registration Time " DataFormatString="{0:t}"/>
You need to account for DateTime Kind too.
public static DateTime GetTime(this DateTime d)
{
return new DateTime(d.TimeOfDay.Ticks, d.Kind);
}

Categories