Java中的日期计算

时间:2013-03-17 19:00:43

标签: java date

我有一个人的出生日期。还有一个日期,比如d1。我想知道这个人是否从d1日期开始的最后一年达到40岁。日期采用'yyyyMMdd'格式

我想到了一些与找出时间并做一些减法有关的事情,然后检查它是否是40等。

有人可以告诉我进行此计算的最佳方法。需要紧急帮助。

4 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标,从使用毫秒,简单的减法和转换到使用Calendar个对象。

您也可以查看joda-time(一个方便的第三方java api处理日期)和

以下是使用Calendar

执行此操作的方法
@Test
public void compareDates() throws ParseException {
    Date d1 = new SimpleDateFormat("yyyyMMdd").parse("20130317");
    Date birthDate1 = new SimpleDateFormat("yyyyMMdd").parse("19700101");
    Date birthDate2 = new SimpleDateFormat("yyyyMMdd").parse("19900101");

    GregorianCalendar cd1 = new GregorianCalendar();
    cd1.setTime(d1);
    cd1.set(Calendar.YEAR, cd1.get(Calendar.YEAR)-1); // one year ago

    GregorianCalendar cbd1 = new GregorianCalendar();
    cbd1.setTime(birthDate1);

    GregorianCalendar cbd2 = new GregorianCalendar();
    cbd2.setTime(birthDate2);

    Assert.assertTrue((cd1.get(Calendar.YEAR) - cbd1.get(Calendar.YEAR)) > 40);
    Assert.assertFalse((cd1.get(Calendar.YEAR) - cbd2.get(Calendar.YEAR)) > 40);
}

答案 1 :(得分:0)

getTime()将以毫秒为单位返回时间。

long diff = d2.getTime() - d1.getTime(); // the difference in milliseconds

我会将其作为将这些毫秒转换为数年的做法。

答案 2 :(得分:0)

public class DateTester{

    private static final long MILLISECONDS_IN_YEAR = 31556926279L;

    public static void main(String[] args) {
            //Note:  These constructors are deprecated
            //I'm just using them for a quick test

    Date startDate = new Date(2013,03,01);
    Date birthday = new Date(1981,01,1981);//Returns false
    Date birthday2 = new Date(1972,03,20); //Returns true
    Date birthday3 = new Date(1973,02,27); //Test edge cases  //Returns false
    Date birthday4 = new Date(1972,02,27); //Test edge cases, //Returns false


    System.out.println(withinYear(birthday, startDate,40));
    System.out.println(withinYear(birthday2, startDate,40));
    System.out.println(withinYear(birthday3, startDate,40));
    System.out.println(withinYear(birthday4, startDate,40));


        System.out.println(withinYear(birthday, startDate,40));
        System.out.println(withinYear(birthday2, startDate,40));
    }

    public static boolean withinYear(Date birthday, Date startDate, int years){
        if(birthday.before(startDate)){
            long difference = Math.abs(birthday.getTime() - startDate.getTime());
            int yearDifference = (int) (difference/MILLISECONDS_IN_YEAR);
            return yearDifference  < (years +1) && yearDifference >= years;
        }
        return false;
    }
}

答案 3 :(得分:0)

避免遗留日期时间类

其他Answers使用现在遗留下来的麻烦的旧日期时间类,取而代之的是java.time类。

使用java.time

LocalDate类表示没有时间且没有时区的仅限日期的值。

LocalDate birthDate = LocalDate.parse( "19540123" , DateTimeFormatter.BASIC_ISO_DATE ) ;
LocalDate d1 = LocalDate.parse( "20110317" , DateTimeFormatter.BASIC_ISO_DATE );

LocalDate dateWhen40YearsOld = birthDate.plusYears( 40 ) ;
Boolean turning40WithinYear = 
    ( ! dateWhen40YearsOld.isBefore( d1 ) )         // "If not before" is a short way of saying "is equal to or later than". 
    && 
    dateWhen40YearsOld.isBefore( d1.plusYears( 1 ) )
;

关于java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和&amp; SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore