簡體   English   中英

Java中日期的加減法

[英]Addition and Subtraction of Dates in Java

我們如何在 java 中添加或減去日期? 例如java.sql.Date格式如下: yyyy-MM-dd ,我如何從中添加 5 個月? 我在一些教程中看到他們正在使用Calendar ,我們可以在上面設置日期嗎? 請幫忙。

示例: 2012-01-01添加 5 個月后將變為2012-06-01

PS:本人是.Net Programmer,正在慢慢學習Java環境。

首先,您必須將String日期轉換為java.util.Date ,而不是必須使用java.util.Calendar來操作日期。 也可以對毫秒進行數學運算,但是我不建議這樣做。

public static void main( final String[] args ) throws ParseException {
    final String sdate = "2012-01-01";
    final SimpleDateFormat df = new SimpleDateFormat( "yyyy-MM-dd" );
    final Date date = df.parse( sdate ); // conversion from String
    final java.util.Calendar cal = GregorianCalendar.getInstance();
    cal.setTime( date );
    cal.add( GregorianCalendar.MONTH, 5 ); // date manipulation
    System.out.println( "result: " + df.format( cal.getTime() ) ); // conversion to String
}

清除用於日期數學的內置Date類。 看一下JodaTime,它對於此類事情具有更好的API。

使用Calendar

Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 5);

要將日期轉換為日歷,請使用:

Date date = your_date_here;

Calendar cal = Calendar.getInstance();
cal.setTime(date);

然后使用日歷算術函數進行加/減:

cal.add(Calendar.MONTH, 5);

或者,將日期轉換為時間以毫秒為單位。 進行數學運算,然后將毫秒轉換回日期。

使用Google軟件包GWT中的CalenderUtils

import com.google.gwt.user.datepicker.client.CalendarUtil;

...

//now
Date d = new Date();
// Now + 2 months
CalendarUtil.addMonthsToDate(d, 2);

另一個選擇是來自第三方Apache Commons庫集合的DateUtils類。 例:

Date d = DateUtils.parseDate("2012-01-01", "yyyy-MM-dd");
Date d2 = DateUtils.addMonths(d, 5);
System.out.println("Old date + 5 months = " + d2);

有多種方法。 其中之一可能與joda.time 有關 這不會通過使用Calendar來回答問題,而是在某人需要時使用另一種方法。 :D

import java.sql.Date;
import org.joda.time.DateTime;
//
DateTime datetime = new DateTime("2012-01-01");
Date dt = new Date(datetime.plusMonths(5).toDate().getTime());
System.out.println(dt);
// This gives output as 2012-06-01

PS:快樂編碼 Java

java.時間

The accepted answer uses java.util date-time API and SimpleDateFormat which was the correct thing to do in 2012. In Mar 2014, the java.util date-time API and their formatting API, SimpleDateFormat were supplanted by the modern date-time API . 從那時起,強烈建議停止使用舊版日期時間 API。

使用java.time的解決方案,現代日期時間 API:

您的日期字符串不需要DateTimeFormatter java.time API 基於ISO 8601 ,因此您不需要指定DateTimeFormatter來解析已經采用 ISO 8601 格式的日期時間字符串,例如您的日期字符串, 2012-01-01可以直接解析為僅包含日期單位的LocalDate實例。

將日期字符串解析為LocalDate后,您可以對其添加或減去不同的日期單位,例如年、月、日等。

演示

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

class Main {
    public static void main(String args[]) {
        LocalDate date = LocalDate.parse("2012-01-01");
        System.out.println(date);

        LocalDate afterFiveMonths = date.plusMonths(5);
        LocalDate beforeFiveMonths = date.minusMonths(5);
        System.out.println(afterFiveMonths);
        System.out.println(beforeFiveMonths);

        // Alternatively,
        afterFiveMonths = date.plus(5, ChronoUnit.MONTHS);
        beforeFiveMonths = date.minus(5, ChronoUnit.MONTHS);
        System.out.println(afterFiveMonths);
        System.out.println(beforeFiveMonths);
    }
}

Output :

2012-01-01
2012-06-01
2011-08-01
2012-06-01
2011-08-01

在線演示

Trail:Date Time中了解有關現代日期時間 API 的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM