我正在尝试编写一些代码来正确设置给定日期的到期日期。
例如,这就是我所拥有的。
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,这不是给定日期的一半。有更简单的方法吗?
答案 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)
java.time.LocalDate.of( 2011 , Month.MAY , 7 )
.plusMonths( 6 )
.toString()
2011-11-07
您正在使用日期时间值,因此您必须考虑时区,异常和闰年等问题。但是你只想要一个没有时间和没有时区的日期,如果你使用仅限日期的课程而不是带日期的课程,那就容易多了。
现代方法使用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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 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。