【问题标题】:getting the difference between date in days in java [duplicate]在java中获取日期之间的差异[重复]
【发布时间】:2023-03-24 21:35:01
【问题描述】:

可能重复:
how to calculate difference between two dates using java

我正在尝试这样的事情, 我试图从组合框中获取日期

Calendar start = Calendar.getInstance();
Calendar end = Calendar.getInstance();  

int Sdate=Integer.parseInt(cmbSdate.getSelectedItem().toString());  
int Smonth=cmbSmonth.getSelectedIndex();
int Syear=Integer.parseInt(cmbSyear.getSelectedItem().toString());  

int Edate=Integer.parseInt(cmbEdate.getSelectedItem().toString());
int Emonth=cmbEmonth.getSelectedIndex();
int Eyear=Integer.parseInt(cmbEyear.getSelectedItem().toString());

start.set(Syear,Smonth,Sdate);  
end.set(Eyear,Emonth,Edate);

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String startdate=dateFormat.format(start.getTime());  
String enddate=dateFormat.format(end.getTime());

我无法减去结束日期和开始日期 如何获取开始日期和结束日期之间的差异??

【问题讨论】:

  • 你怎么不行?例外?日期错误?
  • 我正在尝试在 netbeans 中执行此程序 n 我试图减去 d end.getTime-start.getTime() n 我被告知可以在两个 Date obj 之间使用 - 运算符。
  • 为什么我不能添加我的答案?我没有这样的问题,我有这个问题的另一种解决方案。
  • 可能是因为问题被标记为重复。
  • 现代评论:我建议你不要使用CalendarSimpleDateFormat。这些类设计不佳且早已过时,后者尤其是出了名的麻烦。而是使用来自java.time, the modern Java date and time APILocalDateChronoUnit.DAYS

标签: java date


【解决方案1】:

喜欢this

import java.util.Date;
import java.util.GregorianCalendar;

/**
 * DateDiff -- compute the difference between two dates.
 */
public class DateDiff {
  public static void main(String[] av) {
    /** The date at the end of the last century */
    Date d1 = new GregorianCalendar(2000, 11, 31, 23, 59).getTime();

    /** Today's date */
    Date today = new Date();

    // Get msec from each, and subtract.
    long diff = today.getTime() - d1.getTime();

    System.out.println("The 21st century (up to " + today + ") is "
        + (diff / (1000 * 60 * 60 * 24)) + " days old.");
  }

}

Here 是一篇关于 Java 日期算术的文章。

【讨论】:

    【解决方案2】:
    Calendar start = Calendar.getInstance();
    Calendar end = Calendar.getInstance();
    start.set(2010, 7, 23);
    end.set(2010, 8, 26);
    Date startDate = start.getTime();
    Date endDate = end.getTime();
    long startTime = startDate.getTime();
    long endTime = endDate.getTime();
    long diffTime = endTime - startTime;
    long diffDays = diffTime / (1000 * 60 * 60 * 24);
    DateFormat dateFormat = DateFormat.getDateInstance();
    System.out.println("The difference between "+
      dateFormat.format(startDate)+" and "+
      dateFormat.format(endDate)+" is "+
      diffDays+" days.");
    

    正如 orange80 指出的那样,当跨越夏令时(或闰秒)时,这将不起作用,并且在使用一天中的不同时间时也可能不会给出预期的结果。使用 JodaTime 可能更容易获得正确的结果,因为我知道在 8 之前使用纯 Java 的唯一正确方法是使用 Calendar 的 add 和 before/after 方法来检查和调整计算:

    start.add(Calendar.DAY_OF_MONTH, (int)diffDays);
    while (start.before(end)) {
        start.add(Calendar.DAY_OF_MONTH, 1);
        diffDays++;
    }
    while (start.after(end)) {
        start.add(Calendar.DAY_OF_MONTH, -1);
        diffDays--;
    }
    

    【讨论】:

    • 你能解释一下这段代码吗:1000 * 60 * 60 *24
    • Date.getTime 以毫秒为单位返回自 1970 年以来的时间,因此差异也以毫秒为单位。 1000 毫秒等于 1 秒,60 秒等于 1 分钟,60 分钟等于 1 小时,24 小时等于 1 天。当然,您可以将 diffTime 除以 86400000,但这样您就看不清楚了(好吧,显然还不够清楚;)),那个数字是多少。
    • 注意对于跨越夏令时边界的日期范围将不正确。
    • 我也遇到了同样的问题,但是我发现冗长的代码我认为是非常无效的。虽然这是一个重复的旧的,但我找到了一个简单的方法试试这个public static long getTimeDiff(Date dateOne, Date dateTwo) { long diff = 0; long timeDiff = Math.abs(dateOne.getTime() - dateTwo.getTime()); diff = TimeUnit.MILLISECONDS.toDays(timeDiff); return diff; }
    • @abhilash 以 start.set(2014, Calendar.MARCH, 8) 和 end.set(2014, Calendar.APRIL, 8) 为例;当我运行此程序时(在 3 月 30 日在德国穿越 DST,在 3 月 9 日在美国穿越 DST),我得到了 30 天的差异,而没有受到 orange80 评论启发的修复和正确的 31 天。如果您在 Locale 设置为 India 的计算机上运行此程序,则可能没有区别,因为印度似乎没有夏令时(根据 timeanddate.com/time/dst/2014.html
    【解决方案3】:

    为此使用JodaTime。它比标准的 Java DateTime API 要好得多。这是 JodaTime 中用于计算天数差异的代码:

    private static void dateDiff() {
    
        System.out.println("Calculate difference between two dates");
        System.out.println("=================================================================");
    
        DateTime startDate = new DateTime(2000, 1, 19, 0, 0, 0, 0);
        DateTime endDate = new DateTime();
    
        Days d = Days.daysBetween(startDate, endDate);
        int days = d.getDays();
    
        System.out.println("  Difference between " + endDate);
        System.out.println("  and " + startDate + " is " + days + " days.");
    
      }
    

    【讨论】:

    • 感谢先生的回答。 Faisal,但我只需要使用内置函数和 apis
    • 现在 Java 8 具有与 Joda Time 基本相同的结构,您可以使用 java.time.LocalDateTime 和 ChronoUnit.DAYS.between(startDate,endDate);
    猜你喜欢
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多