2011-05-07 156 views
1

我想写一些代码来正确设置给定某个日期的到期日期。如何在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); 

然而,如果说我的注册日期是5/7/2011到期日期输出我得到的是在2011年11月6日这不完全是一个半年从给定的日期。有没有更简单的方法来做到这一点?

回答

3

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

谢谢im guna试试这个。我不能也将日历对象转换为日期对象是否正确?这样的事情应该工作:日期t =新日期(cal.getTime()。getTime()); – thunderousNinja 2011-05-07 15:36:53

+0

是的,你可以。当您从Calendar.getInstance()返回的Calendar实例返回时,该实例已设置为现在。我认为你的日期可能来自其他地方。我的代码cal.getTime()中的调用返回一个Date对象,它表示未来6个月 - 因此您可以转换。 – planetjones 2011-05-07 15:39:17

2

下面是使用乔达时一个简单的建议:

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

仅供参考,[Joda-Time](http://www.joda.org/joda-time/)项目现在处于[维护模式](https://en.wikipedia.org/wiki/Maintenance_mode),该团队建议迁移到[java.time](http://docs.oracle.com/javase/9​​/docs/api/java/time/package-summary.html)类。请参见[Oracle教程](https://docs.oracle.com/javase/tutorial/datetime/TOC.html)。 – 2018-01-23 03:03:23

0

你真的需要一个有效期限,精确到毫秒?

我会把它实现为x的6个月。

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

也许你喜欢慷慨,也可以说'Sep 1 and 30''Mar 1'。

0

以下是使用TIMEUNIT日期,这是一个有点更具可读性的例子:

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

耻辱它没有一年的一天,看的GregorianCalendar或Jodatime一个更好的API。

0

TL;博士

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

2011-11-07

java.time

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

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

,如果我的注册日期是5/7/2011到期日期输出我得到的是在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) ; 

看到这个code run live at IdeOne.com

2011-05-07

2011-11-07


关于java.time

java.time框架是建立在Java 8和更高版本。这些类代替了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore