thunderousNinja
thunderousNinja

Reputation: 3520

How to set an expiration date in java

I am trying to write some code to correctly set an expiration date given a certain date.

For instance this is what i have.

    Date lastSignupDate = m.getLastSignupDate();
    long expirationDate = 0;
    long milliseconds_in_half_year = 15778463000L;
    expirationDate = lastSignupDate.getTime() + milliseconds_in_half_year; 
    Date newDate = new Date(expirationDate);

However, say if i the sign up date is on 5/7/2011 the expiration date output i get is on 11/6/2011 which is not exactly half of a year from the given date. Is there an easier way to do this?

Upvotes: 3

Views: 38740

Answers (6)

Vikas Thada
Vikas Thada

Reputation: 1

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(new Date().getTime());
// 10 minutes expiration time
calendar.add(calendar.MINUTE, 10);
// prints 10 minutes ahead time  
System.out.println(new Date(calendar.getTime().getTime()));

Upvotes: 0

Basil Bourque
Basil Bourque

Reputation: 339392

tl;dr

java.time.LocalDate.of( 2011 , Month.MAY , 7 )
    .plusMonths( 6 )
    .toString()

2011-11-07

java.time

You are using date-time values, so you must account for issues such as time zones, anomalies, and leap year. But you only want a date without a time-of-day and without a time zone, so much easier if you use a date-only class rather than a date-with-time class.

The modern approach uses java.time rather than the troublesome legacy date-time classes.

if i the sign up date is on 5/7/2011 the expiration date output i get is on 11/6/2011 which is not exactly half of a year from the given date

The LocalDate class represents a date-only value without time-of-day and without time zone.

LocalDate ld = LocalDate.of( 2011 , Month.MAY , 7 ) ;

You can do math with the java.time classes. Look for plus… and minus… methods.

LocalDate sixMonthsLater = ld.plusMonths( 6 ) ;

Or pass the amount of time.

Period p = Period.ofMonths( 6 ) ;
LocalDate sixMonthsLater = ld.plus( p ) ;

See this code run live at IdeOne.com.

2011-05-07

2011-11-07


About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

The Joda-Time project, now in maintenance mode, advises migration to the java.time classes.

To learn more, see the Oracle Tutorial. And search Stack Overflow for many examples and explanations. Specification is JSR 310.

Where to obtain the java.time classes?

The ThreeTen-Extra project extends java.time with additional classes. This project is a proving ground for possible future additions to java.time. You may find some useful classes here such as Interval, YearWeek, YearQuarter, and more.

Upvotes: 2

planetjones
planetjones

Reputation: 12633

I would use the Calendar class - the add method will do this kind of thing perfectly.

http://download.oracle.com/javase/6/docs/api/java/util/Calendar.html

    Date date = new Date();
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    cal.add(Calendar.MONTH, 6);

            java.util.Date expirationDate = cal.getTime();

    System.err.println(expirationDate);

Upvotes: 4

Jonathan Holloway
Jonathan Holloway

Reputation: 63714

Here's an example of using Date with TimeUnit that's a little more readable:

long year = TimeUnit.MILLISECONDS.convert(365, TimeUnit.DAYS);
Date expiry = new Date(System.currentTimeMillis() + year);
System.out.println(expiry);

Shame it doesn't have year and day, look at GregorianCalendar or Jodatime for a better API.

Upvotes: 0

user unknown
user unknown

Reputation: 36250

Do you really need an expiration-date, which is accurate to the millisecond?

I would implement it as 6 Months from x.

Jan. 1 => Jul 1
Sep. 28=> Feb 28
Sep. 29=> Feb 28
Sep. 30=> Feb 28
Oct. 1=>  Mar 1

Maybe you like to be generous, and say 'Mar 1' for 'Sep 29 and 30' too.

Upvotes: 0

Bozho
Bozho

Reputation: 597234

Here's a simple suggestion using joda-time:

DateTime dt = new DateTime(lastSignupDate);
dt = dt.plusDays(DateTimeConstants.MILLIS_PER_DAY * 365 / 2);
// you can also use dt.plusDays(364 / 2);

You can also use a Calendar:

Calendar c = Calendar.getInstance();
c.setTime(lastSignupDate);
c.add(Calendar.MILLISECOND, MILLIS_PER_DAY * 365 / 2);
// or c.add(Calendar.DAY_OF_YEAR, 364 / 2);

Upvotes: 2

Related Questions