How to prorate a yearly subscription

Hello Experts!

I'm creating a subscription-based calculator in Java and I'm trying to figure out how to correctly prorate the value if the subscription.
My yearly subscription fee is a flat $120 per year (365 days).  If a user wants only a 6 month subscription then the cost is $60.  But let's say the subscriber signs on Jan. 15, 2011 and ends his subscription on June 30.  That's only 5 months and 15 days.  I need a formula that can correctly calculate the amount I need to charge.  In this case it would be ~$55.00.  It gets a little trickier if my user signs on Feb. 6th and ends their subscription Dec. 28.
Can anyone help?
Who is Participating?

Improve company productivity with a Business Account.Sign Up

objectsConnect With a Mentor Commented:
yes you can use the Calendar class to get the month

and you can take your start and end date and increment the month of the start until they are  both in the same month

then calculate the #days as I posted above
Why not calculate per day?
Ardhendu SarangiSr. Project ManagerCommented:
The formula you are looking for is -

120/365 * No of days

What Kind of Coding Program is Right for You?

There are many ways to learn to code these days. From coding bootcamps like Flatiron School to online courses to totally free beginner resources. The best way to learn to code depends on many factors, but the most important one is you. See what course is best for you.

As CEHJ has pointed out it is easier to calc the daily amount, then multiply by the number of days.
Obviously the amount per day is fuzzy due to leap years, so one month in July could cost just fractionally less on a leap year.

days in year = 1/1/next - 1/1/current
days subscribed = last - first + 1
amount to pay = days subscribed / days in year * $120
CEHJConnect With a Mentor Commented:
See below (though you would put 'PER_YEAR' as a class variable)
public static double getSub(Date d1, Date d2) {
	final double PER_YEAR = 120;
	long days = TimeDiff.getTimeDifference(d1, d2, TimeDiff.TimeField.DAY);
	return (double)(days * PER_YEAR / 365);

Open in new window

I stress again that you need the +1 in

last - first + 1

Otherwise, you will never get the full year in 1/1 - 31/12, you will be short 1 day
Not only that, a subscription for 7/7-7/7 will result in 0 days, when common sense says 1?
Greengiants15Author Commented:
All - thank so so much for your solutions.  I do have one caveat.  What if a user starts their subscription on Feb.15, 2010 and ends their subscription March 15.  Really, I should charge the user $10 since it's one month but with the formula given:
days * PER_YEAR / 365
That would be:
29 *120 / 365 = 9.53

I guess for situations like this I would have to write a separate condition to calculate something like this?
then you want to count the # months instead of # days

Greengiants15Author Commented:
objects - so are you saying that if I have a situation like this:
Start date: 2/15/2010
End date: 3/30/2010

I first have to calculate the number of months then calculate the number of days?
cyberkiwiConnect With a Mentor Commented:
(sidenote: Banks are happy to pay me less than 1/12 of the annual rate between 15/2 and 15/3!)

If you are not going by daily rate, then a stepped calculation may work better

Is full year? $120
Is start = end?  $120 / days in year (minimum of 1 day)
d = start
months = 0
days = 0
while d < end {
  add 1 month to d
while d < end {
  add 1 day to d
calc = (months + days / 30.0) * $120 / 12

It is possible to have 3 months 30 days which is 1 day less than 4 months in some cases, but you will charge 4 months exactly.
It is also possible to charge 27 days in feb (27/28) at 27/30 of the monthly rate.
Give some take some.
what you have to do depends on how you want to charge :)
Greengiants15Author Commented:
I want to charge $10 for a month, 120 for a year and prorate the days if it falls over a month.
Greengiants15Author Commented:
Is there a way to calculate the number of months?


5 months
Using months is not going to help you. They have different numbers of days
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.