2015-02-10 247 views
1

我已经实现了以下代码来计算剩余的剩余天数。我使用SimpleDateFormat将字符串转换为日期。如果我输入10/02/1993(今天的日期)作为日期,则输出显示剩余0天。但是如果我选择11/02/1993,它显示的是0天后的相同输出。但是如果我改变这个月,即22/07/1993,它显示了160天而不是162天,这是最初的结果。我在这里做错了什么?任何帮助是极大的赞赏。在java中剩余天数

private static void calculateNextBirthday() { 
     Scanner in = new Scanner(System.in); 
     System.out.println("Enter your birthday(dd/MM/yyyy)"); 
     user_input = in.nextLine(); 

     SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

     Calendar user_selected_day = new GregorianCalendar(); 

     Calendar today = new GregorianCalendar(); 

     Date selected_date = null; 
     try { 
      selected_date = formatter.parse(user_input); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     user_selected_day.setTime(selected_date); 

     int user_selected_month = user_selected_day.get(Calendar.MONTH); 
     int CMonth = today.get(Calendar.MONTH); 

     int user_selected_date = user_selected_day.get(Calendar.DAY_OF_MONTH); 
     int CDate = today.get(Calendar.DAY_OF_MONTH); 

     user_selected_day.set(Calendar.YEAR, today.get(Calendar.YEAR)); 

     user_selected_day.set(Calendar.DAY_OF_WEEK,today.get(Calendar.DAY_OF_WEEK)); 

     if (user_selected_month < CMonth) { 
      user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
     } 
     else if (user_selected_month == CMonth){ 
      if(user_selected_date < CDate){ 
       user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
      } 
     } 

     long millis = user_selected_day.getTimeInMillis() - today.getTimeInMillis(); 
     long days; 
     days = (millis/(24 * 60 * 60 * 1000)); 

     System.out.println(String.valueOf(days) + " days left!!"); 
    } 

更新:我已经更新了下面的代码,它工作正常。希望它能帮助未来的人。

`  SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); 

     Calendar user_selected_day = new GregorianCalendar(); 

     Calendar today = new GregorianCalendar(); 

     Date selected_date = null; 

     try { 
      selected_date = formatter.parse(plainDate); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     user_selected_day.setTime(selected_date); 

     int user_selected_month = user_selected_day.get(Calendar.MONTH); 
     int CMonth = today.get(Calendar.MONTH); 

     int user_selected_date = user_selected_day.get(Calendar.DAY_OF_MONTH); 
     int CDate = today.get(Calendar.DAY_OF_MONTH); 

     user_selected_day.set(Calendar.YEAR, today.get(Calendar.YEAR)); 

     user_selected_day.set(Calendar.HOUR_OF_DAY,today.get(Calendar.HOUR_OF_DAY)); 
     user_selected_day.set(Calendar.MINUTE,today.get(Calendar.MINUTE)); 
     user_selected_day.set(Calendar.SECOND,today.get(Calendar.SECOND)); 
     user_selected_day.set(Calendar.MILLISECOND,today.get(Calendar.MILLISECOND)); 


     if (user_selected_month < CMonth) { 
      user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
     } 
     else if (user_selected_month == CMonth){ 
      if(user_selected_date < CDate){ 
       user_selected_day.set(Calendar.YEAR,today.get(Calendar.YEAR) + 1); 
      } 

     } 

     long millis = user_selected_day.getTimeInMillis() - today.getTimeInMillis(); 
     long days; 
     if(user_selected_day.getTime()==today.getTime()){ 
      days = 0; 
     } 
     else{ 
      days = (millis/(24 * 60 * 60 * 1000)); 
     }` 
+1

注意:'/ 24 * 60 * 60 * 1000'不会总是因为每日节约时间(DST)的工作:http://en.wikipedia.org/wiki/Daylight_saving_time – 2015-02-10 16:27:12

+0

@ArnaudDenoyelle : 好。那么,解决方案是什么? – gogs09 2015-02-11 05:48:01

回答

1

的问题是在

user_selected_day.set(Calendar.YEAR, today.get(Calendar.YEAR)); 

这将今天的日期的年份为user_selected天线和月相等,将里面去ELSEIF出去一样,不做任何更改。

另请检查您提到的if else条件。

0

不要自己进行计算。获得日历对象后,使用“添加”方法增加所需的值。

1

您还可以使用Java 8中的LocalDate类来随时添加/减去日期。

java.time提供Period类来表示的时间长度,如 数天,或小时和分钟的。 LocalDate和朋友报价 plus()minus()方法来添加或减去期间或其他 时间相关的对象。期限提供工厂方法,如ofDays()

阅读本示例以供参考。它计算一下日期将是700天从现在开始:

/** 
* DateAdd -- compute the difference between two dates (e.g., today and 700 days 
* from now). 
*/ 
public class Main { 
    public static void main(String[] av) { 
     /** Today's date */ 
     LocalDate now = LocalDate.now(); 
     Period p = Period.ofDays(700); 
     LocalDate then = now.plus(p); 
     System.out.printf("Seven hundred days from %s is %s%n", now, then); 
    } 
} 

运行此程序报告当前的日期和时间,什么日期和时间将是700天从现在开始。例如:

Seven hundred days from 2013-11-09 is 2015-10-10