简体   繁体   中英

Add decimal number to Date - C#

How to convert a decimal number (eg 2.5 ) to year and month (2 years and 6 months) and add it to a given date? I tried DateTime.TryParse and it didn't work.

If you are using it for years then multiply the float you have by 12. 2.5 becomes 30months. Then use the addmonths function. If I enter 5 then it will add 60 months which is 5 years

如果你的初始日期是dt不是

dt = dt.AddMonths((int)(2.5*12));

Usually you could just add a TimeSpan or use one of the Add methods, like this:

decimal yearsToAdd = (decimal)2.5;

int years = (int)Math.Floor(yearsToAdd);
decimal months = yearsToAdd - years;
int actualMonths = (int) Math.Floor(months * 12); // or Ceiling or Round

DateTime x = DateTime.Now.AddYears(years).AddMonths(actualMonths);

The problem is, that when you decimal doesn't yield an exacat number of months, how would you know how long eg half a month is? 28.0 / 2 , 29.0 / 2 , 30.0 / 2 or 31.0 / 2 ? Would you take the length of the month you started with or one of the possible two months you end up with?

decimal x =(decimal)2.5;

int nbYear = Convert.ToInt16(x);
var y = x - Math.Truncate(x);

int nbMonth =Convert.ToInt16 (y*12);
// MessageBox .Show (string.Format (" {0} years and {1} months ",nbYear ,nbMonth ));
DateTime dat=DateTime .Now ;  // or    given date
DateTime dat2 = dat.AddYears(nbYear).AddMonths(nbMonth);

If month is your smallest unit then the solution is, as pointed by many, to multiply number by 12. A more accurate alternative would be to use ticks.

decimal years=3.14592M; // No idea where this came from.
long ticks = (long)(356.0M * (decimal)TimeSpan.TicksPerDay * years); 
DateTime futureDate=DateTime.Today.AddTicks(ticks);

Note that solution will not compensate for leap years. It is not difficult to extend it - you need to calculate number of leap years in the period and use average instead of 356.0M to calculate ticks per year (ie avg. number of days per year * ticks per day).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM