# isDate: JavaScript -> Java



## automatix (1. Feb 2009)

Hallo Forum,

vor kurzem bin ich im Netz auf JS-Datum-Validierung gestoßen. Würde gerne den Algorithmus in meinen Java-Programmen verwenden und habe Schwierigkeiten bei der JS-Java-Übersetzung...

So sieht der JS-Code aus:
	
	
	
	





```
//(c) [url]http://www.smartwebby.com/DHTML/date_validation.asp[/url] :: überarbeitet
/**
 * DHTML date validation script. Courtesy of SmartWebby.com ([url]http://www.smartwebby.com/dhtml/[/url])
 */
// Declaring valid date character, minimum year and maximum year
var dtCh= ".";
var minYear=1900;
var maxYear=2099;
function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}
function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}
function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}
function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		//alert("The date format should be : mm/dd/yyyy")
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		//alert("Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		//alert("Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		//alert("Please enter a valid date")
		return false
	}
return true
}
```
Und hier mein Übersetzungsversuch:
	
	
	
	





```
//(c) [url]http://www.smartwebby.com/DHTML/date_validation.asp[/url] :: überarbeitet
	/**
	 * DHTML date validation script. Courtesy of SmartWebby.com ([url]http://www.smartwebby.com/dhtml/[/url])
	 */
	// Declaring valid date character, minimum year and maximum year
//	String dtCh = ".";
//	int minYear = 1900;
//	int maxYear = 2099;
	public static boolean isInteger(String str) {
	    for (int i = 0; i < str.length(); i++){
	    	int num = -1;
	        // Check that current character is number.
	        char character = str.charAt(i);
	        try {
				num = Integer.parseInt(character + "");
			} catch (Exception e) {
				return false;
			}
	        if (((num < 0) || (num > 9))) {
	        	return false;
	        }
	    }
	    // All characters are numbers.
	    return true;
	}
	
	public static String stripCharsInBag(String str, String bag) {
	    String returnString = "";
	    // Search through string's characters one by one.
	    // If character is not in bag, append to returnString.
	    for (int i = 0; i < str.length(); i++){   
	        char character = str.charAt(i);
	        if (bag.indexOf(character) == -1) returnString += character;
	    }
	    return returnString;
	}
	
	public static int daysInFebruary (int year) {
		// February has 29 days in any year evenly divisible by four,
	    // EXCEPT for centurial years which are not also divisible by 400.
	    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
	}
	
	function DaysArray(n) {
		for (var i = 1; i <= n; i++) {
			this[i] = 31
			if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
			if (i==2) {this[i] = 29}
	   } 
	   return this
	}
	
	public static boolean isDate(String dtStr) {
		// configurations #start#
		String dtCh = ".";
		int minYear = 1900;
		int maxYear = 2099;
		// configurations #stop#
		var daysInMonth = DaysArray(12);
		int pos1 = dtStr.indexOf(dtCh);
		int pos2 = dtStr.indexOf(dtCh, pos1 + 1);
		String strDay = dtStr.substring(0, pos1);
		String strMonth = dtStr.substring(pos1 + 1, pos2);
		String strYear = dtStr.substring(pos2 + 1);
		strYr = strYear;
		if (strDay.charAt(0) == '0' && strDay.length() > 1) strDay=strDay.substring(1);
		if (strMonth.charAt(0) == '0' && strMonth.length() > 1) strMonth=strMonth.substring(1);
		for (int i = 1; i <= 3; i++) {
			if (strYr.charAt(0) == '0' && strYr.length() > 1) strYr = strYr.substring(1);
		}
		int month = Integer.parseInt(strMonth);
		int day = Integer.parseInt(strDay);
		int year = Integer.parseInt(strYr);
		if (pos1 == -1 || pos2 == -1) {
			//alert("The date format should be : mm/dd/yyyy")
			return false;
		}
		if (strMonth.length() < 1 || month < 1 || month > 12) {
			//alert("Please enter a valid month")
			return false;
		}
		if (
			strDay.length() < 1 ||
			day < 1 || day > 31 ||
			(month == 2 && day > daysInFebruary(year)) ||
			day > daysInMonth[month]
		){
			//alert("Please enter a valid day")
			return false;
		}
		if (strYear.length() != 4 || year == 0 || year < minYear || year > maxYear){
			//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
			return false;
		}
		if (dtStr.indexOf(dtCh, pos2 + 1) != -1 || isInteger(stripCharsInBag(dtStr, dtCh)) == false){
			//alert("Please enter a valid date")
			return false;
		}
		return true;
	}
```
Ist schon fast fertig, nur einige wenige Zeilen bereiten mir Probleme: 44-51, 59, 65, 69, 73.

Hatt jemand ne Idee, wie man diese Zeilen java'isieren kann? 

Danke.


----------



## Gelöschtes Mitglied 5909 (1. Feb 2009)

wieso so umständlich wenns schon was fertiges gibt?

http://openbook.galileocomputing.de...13_007.htm#mj00862872cc6795ef98db4016dae8900c

setLenient(false) nicht vergessen


----------



## automatix (1. Feb 2009)

Klasse! Vielen Dank!

Es wäre aber trotzdem interessant zu wissen, wie dieser JS-Code in Java aussehen würde.


----------



## SlaterB (1. Feb 2009)

44-51

schreibe normale Methoden, 'static', Rückgabewert usw.,
das 'this' soll wohl ein neues Array-Objekt sein, 
erstell doch eins wie man Arrays so erstellt in Java,
wenn dir das unbekannt ist, bringt es doch nix, jetzt irgendwelchen Code zu korrigieren

Methoden klein schreiben!

59

var gibts nicht, es gibt int, String oder sonstwas, DaysArray(12) dürfte ein Array sein

65

Variablen ordentlich deklarieren,
Typ name = wert;

69, 73 
sehe da kein Problem, was ist an 73 so anders als an 72 oder 71?
dass strYr nicht korrekt definiert ist, dürfte sicherlich Auswirkungen haben


----------



## automatix (1. Feb 2009)

Hallo SlaterB,

ne, wie man Arrays anlegt und Variablen und Methoden definiert, weiß ich schon, aber ich hab probleme mit diesem JS-"this". Das ist ein Array, genauer ein int-Array. Bloß welcher Länge? Ich habe jetzt die Länge auf (Input-Wert) n+1 gesetzt. Und so sieht jetzt der Code aus:

```
//(c) [url]http://www.smartwebby.com/DHTML/date_validation.asp[/url] :: überarbeitet
	/**
	 * DHTML date validation script. Courtesy of SmartWebby.com ([url]http://www.smartwebby.com/dhtml/[/url])
	 */
	// Declaring valid date character, minimum year and maximum year
//	String dtCh = ".";
//	int minYear = 1900;
//	int maxYear = 2099;
	public static boolean isInteger(String str) {
	    for (int i = 0; i < str.length(); i++){
	    	int num = -1;
	        // Check that current character is number.
	        char character = str.charAt(i);
	        try {
				num = Integer.parseInt(character + "");
			} catch (Exception e) {
				return false;
			}
	        if (((num < 0) || (num > 9))) {
	        	return false;
	        }
	    }
	    // All characters are numbers.
	    return true;
	}
	
	public static String stripCharsInBag(String str, String bag) {
	    String returnString = "";
	    // Search through string's characters one by one.
	    // If character is not in bag, append to returnString.
	    for (int i = 0; i < str.length(); i++){   
	        char character = str.charAt(i);
	        if (bag.indexOf(character) == -1) returnString += character;
	    }
	    return returnString;
	}
	
	public static int daysInFebruary (int year) {
		// February has 29 days in any year evenly divisible by four,
	    // EXCEPT for centurial years which are not also divisible by 400.
	    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
	}
	
	public static int[] DaysArray(int n) {
		int[] thisArr = new int[n + 1];
		for (int i = 1; i <= n; i++) {
			thisArr[i] = 31;
			if (i == 4 || i==6 || i==9 || i==11) {
				thisArr[i] = 30;
			}
			if (i == 2) {
				thisArr[i] = 29;
			}
	   } 
	   return thisArr;
	}
	
	public static boolean isDate(String dtStr, String dtCh, int minYear, int maxYear) {
		// configurations #start#
//		String dtCh = ".";
//		int minYear = 1900;
//		int maxYear = 2099;
		// configurations #stop#
		int[] daysInMonth = DaysArray(12);
		int pos1 = dtStr.indexOf(dtCh);
		int pos2 = dtStr.indexOf(dtCh, pos1 + 1);
		String strDay = dtStr.substring(0, pos1);
		String strMonth = dtStr.substring(pos1 + 1, pos2);
		String strYear = dtStr.substring(pos2 + 1);
		String strYr = strYear;
		if (strDay.charAt(0) == '0' && strDay.length() > 1) strDay=strDay.substring(1);
		if (strMonth.charAt(0) == '0' && strMonth.length() > 1) strMonth=strMonth.substring(1);
		for (int i = 1; i <= 3; i++) {
			if (strYr.charAt(0) == '0' && strYr.length() > 1) strYr = strYr.substring(1);
		}
		int month = Integer.parseInt(strMonth);
		int day = Integer.parseInt(strDay);
		int year = Integer.parseInt(strYr);
		if (pos1 == -1 || pos2 == -1) {
			//alert("The date format should be : mm/dd/yyyy")
			return false;
		}
		if (strMonth.length() < 1 || month < 1 || month > 12) {
			//alert("Please enter a valid month")
			return false;
		}
		if (
			strDay.length() < 1 ||
			day < 1 || day > 31 ||
			(month == 2 && day > daysInFebruary(year)) ||
			day > daysInMonth[month]
		){
			//alert("Please enter a valid day")
			return false;
		}
		if (strYear.length() != 4 || year == 0 || year < minYear || year > maxYear){
			//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
			return false;
		}
		if (dtStr.indexOf(dtCh, pos2 + 1) != -1 || isInteger(stripCharsInBag(dtStr, dtCh)) == false){
			//alert("Please enter a valid date")
			return false;
		}
		return true;
	}
```
Scheint zu funktionieren.


----------



## automatix (1. Feb 2009)

```
//(c) [url]http://www.smartwebby.com/DHTML/date_validation.asp[/url] :: überarbeitet
	/**
	 * DHTML date validation script. Courtesy of SmartWebby.com ([url]http://www.smartwebby.com/dhtml/[/url])
	 */
	public static int daysInFebruary (int year) {
		// February has 29 days in any year evenly divisible by four,
	    // EXCEPT for centurial years which are not also divisible by 400.
	    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28);
	}
	
	public static int[] daysArray(int n) {
		int[] thisArr = new int[n + 1];
		for (int i = 1; i <= n; i++) {
			thisArr[i] = 31;
			if (i == 4 || i==6 || i==9 || i==11) {
				thisArr[i] = 30;
			}
			if (i == 2) {
				thisArr[i] = 29;
			}
	   } 
	   return thisArr;
	}
	
	public static boolean isDate(int day, int month, int year) {
		int[] daysInMonth = daysArray(12);
		if (month < 1 || month > 12) {
			//alert("Please enter a valid month")
			return false;
		}
		if (
			day < 1 || day > 31 ||
			(month == 2 && day > daysInFebruary(year)) ||
			day > daysInMonth[month]
		){
			//alert("Please enter a valid day")
			return false;
		}
		return true;
	}
	
	public static boolean isDate(int day, int month, int year, int minYear, int maxYear) {
		if (!isDate(day, month, year)) {
			return false;
		}
		if (year < minYear || year > maxYear){
			//alert("Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
			return false;
		}
		return true;
	}
```


----------

