在java中将天数(int)转换为天,月和年(包括闰年)

  • 本文关键字:闰年 包括 转换 java int java calendar
  • 更新时间 :
  • 英文 :

  1. 我使用此代码将天数转换为有关日,月和年
  2. 但是结果并不精确,因为我没有考虑31天的闰年和月
  3. 解决/遇到此问题的最佳方法是什么
  4. field_Date1和field_Date2是我的程序的输入
  5. 持续时间=field_Date2-field_Date1
  6. 持续时间是天数(整数 B)
  7. 在 if else 我进行转换(但条件不精确)

    import java.util.concurrent.TimeUnit;
    import java.math.RoundingMode;
    import java.text.DecimalFormat;
    if (field_Date1 == null || field_Date2 == null){
        return "";
    } else {
        Date startDate = (Date)field_Date1;
        Date endDate = (Date)field_Date2;
        long duration  = endDate.getTime() - startDate.getTime();
        long diffInDays = TimeUnit.MILLISECONDS.toDays(duration);
        long diff = duration - TimeUnit.DAYS.toMillis(diffInDays);
        double diffToHours = TimeUnit.MILLISECONDS.toHours(diff);
        float hoursToDay = (float) (diffToHours / 24.0);
        float a =hoursToDay+diffInDays;
        a=Math.floor(a)
        int b = (int)a
        if(b<30)
        {
            StringBuilder sb = new StringBuilder("Day: ")
            sb.append(b)
            String c = sb.toString()
            c
        }
        else if(b<366)
        {
            int months = b/30
            int days_out=b%30
            StringBuilder p1 = new StringBuilder("Days: ")
            StringBuilder p2 = new StringBuilder("Months: ")
            StringBuilder p3 = new StringBuilder("     ")
    
            p1.append(days_out)
            p2.append(months)
            p2.append(p3)
            p2.append(p1)
            String c=p2.toString()
            c
        }
        else
        {
            StringBuilder p1 = new StringBuilder("Months: ")
            StringBuilder p2 = new StringBuilder("Years: ")
            StringBuilder p3 = new StringBuilder("     ")
            StringBuilder p4 = new StringBuilder("Days: ")
            int years = b/365
            int days_out=b%365
            if(days_out>30)
            {
                int m1 = days_out/30
                int m2 = days_out%30
                p2.append(years)
                p1.append(m1)
                p4.append(m2)
                p2.append(p3)
                p2.append(p1)
                p2.append(p3)
                p2.append(p4)
                String hj = p2.toString()
                return hj
            }
            else
            {
            p4.append(days_out)
            p2.append(years)
            p2.append(p3)
            p2.append(p4)
            String c=p2.toString()
            return c
            }
        }
    }
    

Joda-Time

尝试使用 Joda-Time 2.5:

代码段将如下所示:

import java.util.Date;
import org.joda.time.DateTime;
import org.joda.time.Days;
Date startDate = (Date)field_Date1;
Date endDate = (Date)field_Date2;
int days = Days.daysBetween( new DateTime(startDate), new DateTime(endDate) ).getDays(); 

java.time

或者可以使用java.time(Java8)中的以下方法:

public static Period between(LocalDate startDateInclusive,
                             LocalDate endDateExclusive)

这将获得两个日期之间的时间段,包括年数、月数和天数。

如果你想要两个日期之间的差异(以天为单位),包括考虑闰年等,java.time 包(Java 8 中的新功能)给你:

LocalDate firstDate = LocalDate.of(2014, Month.DECEMBER, 1);
LocalDate secondDate = LocalDate.of(2016, Month.MARCH, 12);
long days = firstDate.until(secondDate,ChronoUnit.DAYS);

给你467天。

或者

Period period = firstDate.until(secondDate);

会给你一个 Period 对象,它存储分解为年、月和日的时间,即 467 天,你得到 1 年、3 个月和 11 天。这对人类的可读性有好处。但是,如果您想要总天数,则从 Period 对象中获取它并不容易,因此最好使用我给出的第一个选项。

最新更新