2012-01-13 43 views
0

我想计算两个日期之间的天数差异。我的代码在日期的年份没有变化时工作正常,但是当我计算两个日期之间的差异时(如2012年1月13日至2011年12月13日),它会给出负值。当我计算当前日期和未来日期之间的差异时,它也会给出错误的差异值。请帮帮我。先谢谢你。这里是我的代码:无法获得java中两个日期之间的天数差异

//getting values from text box 
String fromtext = from.getText().toString(); 
String totext = to.getText().toString(); 
//sdf if a simple date formatter 
SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 
Date fromdate = (Date) sdf.parse(fromtext); 
Date todate = (Date) sdf.parse(totext); 

Calendar fromcal = Calendar.getInstance(); 
Calendar tocal = Calendar.getInstance(); 


    fromcal.setTime(fromdate); 
    tocal.setTime(todate);// setting to date 


    int reportDays=(int)(todate.getTime()-fromdate.getTime())/(3600*24*1000); 

请告诉我什么是计算天差的最好方法。

+0

看看[这个例子](http://www.roseindia.net/java/beginners/DateDifferent.shtml) – CloudyMarble 2012-01-13 06:55:12

回答

1

除了格式问题已经mentionned,你是可能会有溢出。 试试这个:

int reportDays=(int)((todate.getTime()-fromdate.getTime())/(3600*24*1000)); 
+0

添加正确的数据究竟这是我在做什么wrong.It这么多的工作正常now.Thank你...... :) – picaso 2012-01-13 07:37:05

6

日期输入:13/01/201213/12/2011

格式似乎dd/MM/yyyy并且使用的是错误的(即MM/dd/yyyy

+0

对不起,它输入的错误。但每当我给正确的格式,它返回负值... .... – picaso 2012-01-13 07:00:49

+0

请与代码 – 2012-01-13 07:10:09

0

使用乔达时间将是最简单的方法。

0

检查验证码:

import java.util.Calendar; 

public class DateDifferent{ 
    public static void main(String[] args){ 
    Calendar calendar1 = Calendar.getInstance(); 
    Calendar calendar2 = Calendar.getInstance(); 
    calendar1.set(2007, 01, 10); 
    calendar2.set(2007, 07, 01); 
    long milliseconds1 = calendar1.getTimeInMillis(); 
    long milliseconds2 = calendar2.getTimeInMillis(); 
    long diff = milliseconds2 - milliseconds1; 
    long diffSeconds = diff/1000; 
    long diffMinutes = diff/(60 * 1000); 
    long diffHours = diff/(60 * 60 * 1000); 
    long diffDays = diff/(24 * 60 * 60 * 1000); 
    System.out.println("\nThe Date Different Example"); 
    System.out.println("Time in milliseconds: " + diff + " milliseconds."); 
    System.out.println("Time in seconds: " + diffSeconds + " seconds."); 
    System.out.println("Time in minutes: " + diffMinutes + " minutes."); 
    System.out.println("Time in hours: " + diffHours + " hours."); 
    System.out.println("Time in days: " + diffDays + " days."); 
    } 
} 
0

这里有一个简单的小类我写了这个目的:

import java.text.DateFormat; 
import java.text.ParseException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class DifferenceInDays 
{ 
    public int dateOffset(String incomingDate) throws ParseException 
    { 
     // parse dates 
     DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); 
     Date date = (Date) formatter.parse(incomingDate); 

     // convert to milliseconds 
     long millisecs = date.getTime(); 

     // convert to days 
     int offsetInDays = (int) Math.abs(millisecs/(1000 * 60 * 60 * 24)); 
     return offsetInDays; 
    } 
} 

它需要使用绝对值方法负偏移的照顾。

0

如果您使用具有夏令时的区域设置进行此操作,并且夏令时开始前和结束日期都是夏令时之前和之后,则结果可能会相差1天。这是因为DateCalendar使用时区。

如果你只打算来对付年1900和2100之间的日期,有一个简单的计算,这将给你自1900年以来的天数:

public static int daysSince1900(Date date) { 
    Calendar c = new GregorianCalendar(); 
    c.setTime(date); 

    int year = c.get(Calendar.YEAR); 
    if (year < 1900 || year > 2099) { 
     throw new IllegalArgumentException("daysSince1900 - Date must be between 1900 and 2099"); 
    } 
    year -= 1900; 
    int month = c.get(Calendar.MONTH) + 1; 
    int days = c.get(Calendar.DAY_OF_MONTH); 

    if (month < 3) { 
     month += 12; 
     year--; 
    } 
    int yearDays = (int) (year * 365.25); 
    int monthDays = (int) ((month + 1) * 30.61); 

    return (yearDays + monthDays + days - 63); 
} 

因此,为了获得差异在两个日期之间的天数中,计算自1900年以来的天数并计算差异。我们daysBetween方法是这样的:

public static Integer getDaysBetween(Date date1, Date date2) { 
    if (date1 == null || date2 == null) { 
     return null; 
    } 

    int days1 = daysSince1900(date1); 
    int days2 = daysSince1900(date2); 

    if (days1 < days2) { 
     return days2 - days1; 
    } else { 
     return days1 - days2; 
    } 
} 

不要问我在哪里,这个计算从因为我们自从90年代初用它来了。

+0

谢谢你亲爱的......谢谢很多...:) – picaso 2012-03-07 08:04:59

0

TL;博士

ChronoUnit.DAYS.between(
    LocalDate.parse("13/01/2012" , DateTimeFormatter.ofPattern("dd/MM/uuuu")) , 
    LocalDate.parse("13/12/2011" , DateTimeFormatter.ofPattern("dd/MM/uuuu")) 
) 

使用java.time

与取代的麻烦旧的遗留日期时间类,如Date & Calendar现代java.time类容易得多。

(13/01/2012 to 13/12/2011), 

LocalDate类表示没有时间一天和不同时区的日期,唯一的价值。使用ChronoUnit计算经过的天数。

long days = ChronoUnit.DAYS.between(start , stop); 

当然,返回时间的天数为负数。注意您的止损日期早于您的开始日期。

时区对确定日期至关重要。对于任何特定的时刻,日期因地区而异。例如,Paris France午夜后几分钟是新的一天,而在Montréal Québec仍然是“昨天”。

continent/region的格式指定一个proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母缩写,如ESTIST,因为它们是而不是真正的时区,不是标准化的,甚至不是唯一的(!)。

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

您可以再次使用ChronoUnit来计算未来的日子。

long days = ChronoUnit.DAYS.between(today , today.plusMonths(7)); 

关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore