我怎样才能获得以数月为单位的时间段?

时间:2016-02-10 12:55:58

标签: java date

我有两个字符串,如"March 2012""April 2013"。我需要减去这些日期,并得到类似:"1 year 2 month"

我知道如何在几天内得到它:

df.parse(secondDate).getTime() - df.parse(firstDate).getTime())/(1000*60*60*24)

但我会收到395天。我怎样才能以年月形式获得它?我知道它应该很容易,但我不知道该怎么做。

4 个答案:

答案 0 :(得分:2)

对于此类问题,最好使用Java 8中引入的新Java Time API

我们有2个代表一年零一个月的字符串。因此,我们将使用自定义YearMonth将每个String解析为DateTimeFormatter对象。月份名称采用长英文形式,因此我们将使用模式"MMMM yyyy"

解析它们之后,我们可以使用Period.between获取这两个时间对象之间的时间段。此方法需要LocalDate作为参数,因此我们需要为每个YearMonth添加一天:在这里,我们将其设置为该月的第一天(重要的是两者都设置为相同天)。

最后,getYears()会返回此期间的年数,getMonths()会返回月份数。

public static void main(String[] args) {
    String startStr = "March 2012";
    String endStr = "April 2013";

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM yyyy", Locale.ENGLISH);
    YearMonth start = YearMonth.parse(startStr, formatter);
    YearMonth end = YearMonth.parse(endStr, formatter);

    Period period = Period.between(start.atDay(1), end.atDay(1));

    System.out.println(period.getYears() + " years and " + period.getMonths() + " months.");
    // prints "1 years and 1 months." (you could add check for the pluralization of course ;) )
}

使用此方法,您无需担心棘手的注意事项,它会由API自动处理。

答案 1 :(得分:-2)

使用Java8 API java.time.Period,它为您提供基于日期的时间量:

Period p = Period.between(firstDate, secondDate);
System.out.println(p.getYears()+" years, " + p.getMonths() + " months, and " + p.getDays() + " days.");

答案 2 :(得分:-2)

检查以下示例,它应该正常工作并解决闰年案例,仅取决于年份和月份:

class foo
{
    private byte bar;

    public int BarAsInt
    {
        get { return Convert.ToInt32(bar); }
        set { bar = Convert.ToByte(value); }
    }

    public string BarAsString
    {
        get { return bar.ToString(); }
        set { bar = byte.Parse(value); }
    }
}

答案 3 :(得分:-2)

您可以根据需要自定义以下代码:

import java.util.*;
import java.lang.*;
import java.io.*;

import java.util.Calendar;
import java.text.SimpleDateFormat;

class MyClass
{
    public static void main(String[] args) throws Exception
    {
        MyClass tdt = new MyClass();
        System.out.println("Date: "+tdt.doSubtractMath("31/10/2000","31/12/2016").getTime());
    }
    /**
    * method to create a calendar object, subtract time, and return result
    */
    private Calendar doSubtractMath(String firstDate, String secondDate) throws Exception
    {
        SimpleDateFormat sdf = new SimpleDateFormat("d/MM/yyyy");

        Calendar secondDateCalender = Calendar.getInstance();

        secondDateCalender.setTime(sdf.parse(secondDate));


        Calendar firstDateCalendar = Calendar.getInstance();

        firstDateCalendar.setTime(sdf.parse(firstDate));

        secondDateCalender.add(Calendar.MINUTE, -1 * firstDateCalendar.get(Calendar.MINUTE));

        secondDateCalender.add(Calendar.HOUR, -1 * firstDateCalendar.get(Calendar.HOUR));

        secondDateCalender.add(Calendar.DAY_OF_MONTH, -1 * firstDateCalendar.get(Calendar.DAY_OF_MONTH));

        secondDateCalender.add(Calendar.YEAR, -1 * firstDateCalendar.get(Calendar.YEAR));

        return secondDateCalender;

    }
}