2016-08-16 5 views
-2

Я вводил определенную дату (dd/MM/yyyy), показывая ее Output что-то еще.SimpleDateFormat вводит неверно Дата

import java.text.*; 
import java.io.*; 
import java.util.*; 
class InvalidUsernameException extends Exception  //Class InvalidUsernameException 
{ 
    InvalidUsernameException(String s) 
    { 
     super(s); 
    } 
} 

/////////////////////////////////////////////////////////////////////////////////////////// 
class InvalidPasswordException extends Exception  //Class InvalidPasswordException 
{ 
    InvalidPasswordException(String s) 
    { 
     super(s); 
    } 
} 
/////////////////////////////////////////////////////////////////////////////////////////// 
class InvalidDateException extends Exception  //Class InvalidPasswordException 
{ 
    InvalidDateException(String s) 
    { 
     super(s); 
    } 
} 

/////////////////////////////////////////////////////////////////////////////////////////// 
class EmailIdb1         //Class Email Id b1 
{ 
    String username, password; 
    int domainid; 
    Date dt; 

    EmailIdb1() 
    { 
     username = ""; 
     domainid = 0; 
     password = ""; 
     dt = new Date(); 
    } 


    EmailIdb1(String u, String pwd, int did, int d, int m, int y) 
    { 
     username = u; 
     domainid = did; 
     password = pwd; 
     dt = new Date(y,m,d);  // I think There is a problem 
     SimpleDateFormat formater = new SimpleDateFormat ("yyyy/MM/dd"); //Or there can be a problem 

     try{ 
      if((username.equals("User"))) 
      { 
       throw new InvalidUsernameException("Invalid Username"); 
      } 
      else if((password.equals("123"))) 
      { 
       throw new InvalidPasswordException("Invalid Password"); 
      } 
      else{ 
       System.out.println("\nSuccesfully Login on Date : "+formater.format(dt)); 

      }   
     } 
     catch(Exception e) 
     { 

     } 
    } 
} 


/////////////////////////////////////////////////////////////////////////////////////////// 
class EmailId         //Class Email Id 
{ 
    public static void main(String args[]) 
    { 
     int d,m,y,did; 
     String usn,pwd; 
     EmailIdb1 eml; 

     try{ 
      usn = args[0]; 
      pwd = args[1]; 
      did = Integer.parseInt(args[2]); 
      d = Integer.parseInt(args[3]); 
      m = Integer.parseInt(args[4]); 
      y = Integer.parseInt(args[5]); 

      switch(m) 
      { 
       case 2: if(d==29 && y%4 == 0) 
         { 
          eml = new EmailIdb1(usn,pwd,did,d,m,y); 
         } 
         else if(d<=28 && d>=1) 
         { 
          eml = new EmailIdb1(usn,pwd,did,d,m,y); 
         } 
         else{ 
          throw new InvalidDateException("Wrong Date."); 
         } 
         break; 

       case 1: case 3: case 5: case 7: case 8: case 10: 
       case 12: if(d>=1 && d<=31) 
         { 
          eml = new EmailIdb1(usn,pwd,did,d,m,y); 
         } 
         else 
         { 
          throw new InvalidDateException("Invalid Date"); 
         } 
        break; 
       case 4: case 6: case 9: 
       case 11: if(d>=1 && d<=30) 
         { 
          eml = new EmailIdb1(usn,pwd,did,d,m,y); 
         } 
         else 
         { 
          throw new InvalidDateException("Invalid Date"); 
         } 
        break; 
       default : throw new InvalidDateException("Invalid Date"); 
      } 


     } 
     catch(InvalidDateException ed) 
     { 
      System.out.println(ed); 
     } 
    } 
} 

Меня и двух моих друзей есть подобного рода проблемы. Не знаю, почему это происходит. Мой учитель тоже не смог найти то, что проблема

Выход должен быть

Successfully Login on Date : 1994/05/04 

этот вход

Successfully Login on Date : 3894/06/04 
+1

Вы не должны использовать конструктор Date с тремя целыми числами, поскольку он исправлен – Jens

+1

Что вы _do_ с 'SimpleDateFormat'? Кроме того, пустые блоки блокировки никогда не должны использоваться. Постскриптум комментарии к вашему коду в лучшем случае бесполезны, а в худшем - на самом деле читабельность. –

+4

читайте документацию http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#Date(int, int, int): год - год минус 1900. – Jens

ответ

2

Прежде всего

 new Date(int year, int month, int date) 

устарела - вам не следует использовать его

Во-вторых, в соответствии с Javadoc:

/** 
* Allocates a <code>Date</code> object and initializes it so that 
* it represents midnight, local time, at the beginning of the day 
* specified by the <code>year</code>, <code>month</code>, and 
* <code>date</code> arguments. 
* 
* @param year the year minus 1900. 
* @param month the month between 0-11. 
* @param date the day of the month between 1-31. 
* @see  java.util.Calendar 
* @deprecated As of JDK version 1.1, 
* replaced by <code>Calendar.set(year + 1900, month, date)</code> 
* or <code>GregorianCalendar(year + 1900, month, date)</code>. 
*/ 

Так что, если вы передаете в 1994 году, вы получите Свидание с годом «3894». Если вы хотите получить «1994», вы должны пройти 94 года. И месяцы представлены как int из диапазона 0-11, поэтому, если вы пройдете 5, в вашем случае оно будет отформатировано как «06», потому что 5 представляет собой июнь, а не май.

+0

Спасибо, настоящая помощь ... – Priyank