当前位置: 首页 > 知识库问答 >
问题:

Java方法查找两个日期对象之间的年、月和日差异

陶弘业
2023-03-14

我有开始日期和结束日期。这两个日期之间的持续时间应该是年、月和日的形式。我是新来的java。当我运行下面的方法时,我得到的结果是0年12个月1天。请建议一个替代方案,以获得年,月和天的准确差异。

import java.sql.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Duration {

    private String getAssignmentDuration(java.util.Date oldDate, java.util.Date newDate) {
        Calendar c1 = Calendar.getInstance();
        Calendar c2 = Calendar.getInstance();
        if (oldDate.compareTo(newDate) > 0) {
            c1.setTime(newDate);
            c2.setTime(oldDate);
        } else {
            System.out.println("invalid");
            return "Invalid selection";

        }
        int year = 0;
        int month = 0;
        int days = 0;
        boolean doneMonth = false;
        boolean doneYears = false;
        while (c1.before(c2)) {
            //log.debug("Still in Loop");
            if (!doneYears) {
                c1.add(Calendar.YEAR, 1);
                year++;
            }
            if (c1.after(c2) || doneYears) {
                if (!doneYears) {
                    doneYears = true;
                    year--;
                    c1.add(Calendar.YEAR, -1);
                }   
                if (!doneMonth) {
                    c1.add(Calendar.MONTH, 1);
                    month++;
                }
                if (c1.after(c2) || doneMonth) {
                    if (!doneMonth) {
                        doneMonth = true;
                        month--;
                        c1.add(Calendar.MONTH, -1);
                    }

                    c1.add(Calendar.DATE, 1);
                    days++;
                    if (c1.after(c2)) {
                        days--;
                    }
                    // this will not be executed
                    if (days == 31 || month==12) {
                        break;
                    }
                }
            }
        }
        System.out.println(year + " years, " + month + " months, " + days + " days");
        return year + " years, " + month + " months, " + days + " days";

    }


    public static void main(String[] args) {
        Duration d1= new Duration();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        java.util.Date oldDate = null;
        try {
            oldDate = sdf.parse("2012/08/29");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        java.util.Date newDate = null;
        try {
            newDate = sdf.parse("2013/08/31");
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        d1.getAssignmentDuration(oldDate, newDate);
    }

}

共有3个答案

钮才哲
2023-03-14
Period.between( 
    LocalDate.of( 2017 , Month.JANUARY , 23 ) , 
    LocalDate.of( 2017 , Month.MARCH , 27 ) 
)

呼叫:

.getYears()
.getMonths()
.getDays()

您使用的是麻烦的旧日期时间类,现在是遗留的,被java取代。时间课。

LocalDate类表示一个只有日期的值,没有一天中的时间,也没有时区。

时区对于确定日期至关重要。在任何一个特定的时刻,世界各地的日期都因地区而异。例如,法国巴黎午夜过后几分钟是新的一天,而魁北克山仍然是“昨天”。

大陆/地区的格式指定适当的时区名称,例如美国/蒙特利尔非洲/卡萨布兰卡,或太平洋/奥克兰。切勿使用3-4个字母的缩写,如ESTIST,因为它们不是真正的时区,也不是标准化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

今天toString():2017-05-05

对于我们的示例,我们创建另一个LocalDate

LocalDate earlier = today.minusMonths( 2 ).minusWeeks( 3 ).minusDays( 2 ) ;

earlier.toString(): 2017-02-10

若要以年-月-日粒度表示未附加到时间轴的时间跨度,请使用周期类。

Period p = Period.between( earlier , today ) ;
int years = p.getYears();
int months = p.getMonths();
int days = p.getDays();

查看此代码在IdeOne上的实时运行。通用域名格式

ISO 8601标准定义了日期时间值的文本表示格式。对于年-月-日的持续时间,模式为PnYnMnDTnHnMnS,其中P标记开始,而T将年-月-日部分与时-分-秒部分分开。

java.time类在解析/生成字符串时默认使用标准格式。类在其toString方法中生成这个特定的模式。

String output = p.toString() ;

p、 toString():P2M25D

刘子实
2023-03-14

Joda Time有一个可以使用的时间间隔概念,如:

Interval interval = new Interval(oldDate.getTime(), newDate.getTime());

然后使用句点对象,如:

Period period = interval.toPeriod().normalizedStandard(PeriodType.yearMonthDay());

PeriodFormatter formatter = new PeriodFormatterBuilder()
            .appendYears()
            .appendSuffix(" year ", " years ")
            .appendSeparator(" and ")
            .appendMonths()
            .appendSuffix(" month ", " months ")
            .appendSeparator(" and ")
            .appendDays()
            .appendSuffix(" day ", " days ")
            .toFormatter();
System.out.println(formatter.print(period));

你将很容易地在几年或几个月内打印出你的差异。

可能你在发布问题时改变了一些东西,因为要修复你的代码(注意,我没有测试你的代码是否适用于所有类型的范围),你只需要正确初始化日历对象,并反向无效的选择检查:

Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
if (oldDate.compareTo(newDate) < 0) {
    c2.setTime(newDate);
    c1.setTime(oldDate);
} else {
    System.out.println("invalid");
    return "Invalid selection";
}
谢墨竹
2023-03-14
 public static String getDateDifferenceInDDMMYYYY(Date from, Date to) {
        Calendar fromDate=Calendar.getInstance();
        Calendar toDate=Calendar.getInstance();
        fromDate.setTime(from);
        toDate.setTime(to);
        int increment = 0;
        int year,month,day;
        System.out.println(fromDate.getActualMaximum(Calendar.DAY_OF_MONTH));
        if (fromDate.get(Calendar.DAY_OF_MONTH) > toDate.get(Calendar.DAY_OF_MONTH)) {
            increment =fromDate.getActualMaximum(Calendar.DAY_OF_MONTH);
        }
         System.out.println("increment"+increment);
// DAY CALCULATION
        if (increment != 0) {
            day = (toDate.get(Calendar.DAY_OF_MONTH) + increment) - fromDate.get(Calendar.DAY_OF_MONTH);
            increment = 1;
        } else {
            day = toDate.get(Calendar.DAY_OF_MONTH) - fromDate.get(Calendar.DAY_OF_MONTH);
        }

// MONTH CALCULATION
        if ((fromDate.get(Calendar.MONTH) + increment) > toDate.get(Calendar.MONTH)) {
            month = (toDate.get(Calendar.MONTH) + 12) - (fromDate.get(Calendar.MONTH) + increment);
            increment = 1;
        } else {
            month = (toDate.get(Calendar.MONTH)) - (fromDate.get(Calendar.MONTH) + increment);
            increment = 0;
        }

// YEAR CALCULATION
        year = toDate.get(Calendar.YEAR) - (fromDate.get(Calendar.YEAR) + increment);
     return   year+"\tYears\t\t"+month+"\tMonths\t\t"+day+"\tDays";
    }

    public static void main(String[] args) {
        Calendar calendar = Calendar.getInstance();
        calendar.set(1999,01,8);
       /*  Calendar calendar1 = Calendar.getInstance();
        calendar1.set(2012,01,23);*/
        System.out.println(getDateDifferenceInDDMMYYYY(calendar.getTime(),new Date()));
    }
 类似资料:
  • 我已经搜索了4个小时了,但是还没有找到一个用JavaScript计算两个日期(年、月和天)之间差异的解决方案,比如:2010年4月10日是3年、x月和y天之前。 有很多解决方案,但它们只提供了日、月或年的格式差异,或者它们不正确(意味着没有考虑一个月或闰年的实际天数,等等)。做那件事真的有那么难吗? 我看了一下: http://momentjs.com/->只能输出年、月或天的差异 http://

  • 我试图在我正在创建的C#应用程序中显示两个日期之间的年、月和日。(使用控制台进行测试) 我正在使用NodaTime来实现这一点,但在接下来的几个月里,我遇到了一些问题。 我已经阅读了这里的大部分问题和答案,但没有找到任何我可以从中受益的东西。 大多数时候函数工作但有时它不添加月如果天 我使用这个代码进行测试 (2017, 10, 16)和(2018, 1, 15)应该显示为3个月,但它们显示为2个

  • 假设我有:Employee模型,它的属性变量是startDate,促销模型的属性变量是promotionDate。我想知道员工升职前工作了多长时间,我必须找出升职日期和开始日期之间的差异。如果我是员工的话。getStartDate()和promotionDate作为促销。getPromotionDate,如何查找任何日期的年、月和日的差异, 任何帮助都将不胜感激。 更新:我解决了以下问题 非常感谢

  • 嗯,我在这里发现了很多这样的问题,试图获得年、月和日的两个日期之间的差异。。。但没有满足我要求的答案。 所以我写了一些计算的东西,它似乎是有效的,但也许这里的一些专家可以进行更正,或者帮助使这更简单。

  • 我有两次约会。一个是以YYYYMMDD格式从其他应用程序的表中检索的,第二个日期是本地时间,我需要这两个日期之间的天数/月/年。 我试过了 但这给了我一些乱七八糟的数字。 变量$t=Fri Dec31 00:00:00 9999 变量$今天=Wed Feb19 14:40:55 2020 产出:25182094888 有什么想法吗?提前谢谢。

  • 问题内容: 我有以下代码可以成功获取两天之间的差异(以天,小时,分钟,秒为单位): 但是,当日期跨入另一个月份时,这将不起作用,例如: 是否可以智能地跨越几个月并获得准确的时差?我对Joda熟悉,但是我想坚持使用标准Java API,除非没有Joda这样的东西是不可能的。 问题答案: 您正在使用 应该 您会得到正确的结果 这是日期模式的javadoc。是每月的一天。是一年中的一天。您的对象只是没有