【问题标题】:Converting number of days(int) into days,months and years in java (including leap year)在java中将天数(int)转换为天,月和年(包括闰年)
【发布时间】:2014-12-01 09:41:50
【问题描述】:
  1. 我使用此代码将天数转换为相应的日、月和年
  2. 但结果并不准确,因为我没有考虑闰年和闰月 31 天
  3. 解决/遇到此问题的最佳方法是什么
  4. field_Date1 和 field_Date2 是我的程序输入的
  5. duration=field_Date2-field_Date1
  6. duration 是天数(int 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
            }
    
        }
    }
    

【问题讨论】:

  • 你能从 Java 8 或 Joda Time 使用 java.time 吗?这两个都会让它更干净......
  • @JonSkeet java.time 中可以使用什么函数?我在tutorialspoint中看到了方法描述,但是该方法更多的是比较,很可能无法解决我的问题,先生
  • 好吧,如果你能确认你可以使用 Java 8,我会把它写下来作为答案......但如果你给出具体的例子,它也会很有用,并说什么输入数据所在的表格。(java.util.Date 不是一个很好的起点。)
  • @JonSkeet 我对docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html 做了一些研究。先生,你能给我任何提示/要使用什么功能,因为我想先试试我自己的。任何粗略的想法也很乐意分享。提前致谢。*(我首先阅读了您关于 Stack Overflow 相关电子邮件的博文)
  • DS Stack 现在已经给出了 Joda Time 和 Java 8 的答案。基本上,Period 类型在这两种情况下都是你的朋友......

标签: java calendar


【解决方案1】:

乔达时间

尝试使用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)

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

【讨论】:

  • 我建议也将DateTimeZone 传递给DateTime 的构造函数,而不是隐式依赖JVM 当前的默认时区。
  • @DS Stack 你能提供更简短的例子(java.time),我可以应用到我的问题中
  • LocalDate startDate = (LocalDate)field_Date1; LocalDate endDate = (LocalDate)field_Date2; Period p = Period.between(startDate, endDate); System.out.println("Duration between the dates is:" + p.getYears() + " years, " + p.getMonths() + " months, and " + p.getDays() + " days.";
  • @DSStack 真的很有帮助,非常感谢
【解决方案2】:

如果您想要两个日期之间的天数差异,包括考虑闰年等,java.time package(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 对象,它存储分解为年、月和日的时间,即。你得到 1 年 3 个月 11 天,而不是 467 天。这有利于人类的可读性。但是,如果您想要总天数,从 Period 对象中获取它并不容易,因此您最好使用我给出的第一个选项。

【讨论】:

    猜你喜欢
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多