如何在java中设置过期日期

时间:2011-05-07 15:27:00

标签: java date

我正在尝试编写一些代码来正确设置给定日期的到期日期。

例如,这就是我所拥有的。

    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);

但是,如果我的注册日期是2011年5月7日,我得到的到期日期输出是在11/6/2011,这不是给定日期的一半。有更简单的方法吗?

5 个答案:

答案 0 :(得分:4)

我会使用Calendar类 - add方法可以完美地完成这类工作。

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);

答案 1 :(得分:2)

这是一个使用joda-time的简单建议:

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

您还可以使用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);

答案 2 :(得分:1)

TL;博士

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

2011-11-07

java.time

您正在使用日期时间值,因此您必须考虑时区,异常和闰年等问题。但是你只想要一个没有时间和没有时区的日期,如果你使用仅限日期的课程而不是带日期的课程,那就容易多了。

现代方法使用java.time而不是麻烦的遗留日期时间类。

  

如果我的注册日期是2011年5月7日,我得到的到期日期输出是11/6/2011,这不是指定日期的一半年

LocalDate类表示没有时间且没有时区的仅限日期的值。

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

您可以使用java.time类进行数学运算。查找plus…minus…方法。

LocalDate sixMonthsLater = ld.plusMonths( 6 ) ;

或者通过时间。

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

请参阅此code run live at IdeOne.com

  

2011-05-07

     

2011-11-07

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 3 :(得分:0)

你真的需要一个到期日,准确到毫秒吗?

我会将它从x开始实施为6个月。

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

也许你喜欢慷慨,并且也为'9月29日和30日'说“3月1日”。

答案 4 :(得分:0)

这是一个使用Date和TimeUnit的例子,它更具可读性:

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

耻辱它没有年复一天,请看GregorianCalendar或Jodatime以获得更好的API。