繁体   English   中英

如何在 java 中设置到期日期

[英]How to set an expiration date in java

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

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

    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 日,那么我得到的到期日期 output 是 2011 年 11 月 6 日,这不是给定日期的半年。 有没有更简单的方法来做到这一点?

我会使用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);

这是一个使用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);

TL;博士

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

2011-11-07

java.time

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

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

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

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

请参阅IdeOne.com上的代码

2011-05-07

2011-11-07


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如IntervalYearWeekYearQuarter ,和更多

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

我将从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日”。

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

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

遗憾的是它没有年复一年,请看GregorianCalendar或Jodatime以获得更好的API。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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