2011-05-07 66 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

相關問題