[英]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);
java.time.LocalDate.of( 2011 , Month.MAY , 7 )
.plusMonths( 6 )
.toString()
2011-11-07
您正在使用日期时间值,因此您必须考虑时区,异常和闰年等问题。 但是你只想要一个没有时间和没有时区的日期,如果你使用仅限日期的类而不是带日期的类,那么就更容易了。
现代方法使用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 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
你真的需要一个到期日,精确到毫秒吗?
我将从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.