PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [JAVA] Systemdatum einlesen und damit arbeiten



Pfanni
10-03-2003, 08:44
Hallo,

ich bin JAVA Newbie und spiele momentan etwas mit Syntax rum und da hab ich gleich mal so ne Frage ;)

Gibt es eine Möglichkeit das aktuelle Systemdatum (als Variable, Array o.ä.) einzulesen und damit zu arbeiten.
Am Anfang will ichs mal ganz einfach machen, einfach so zum Test.

also z.b.

Datum ist z.b. 10.03.2003:

if true dann Variable int b; auf 5 setzten und if false b=6; oder so. Mir gehts dabei auch ums Jahr. Was ich dabei etwas lernen möchte ist einfach der Umgang mit sowas. Das Ganze soll einfach auf der Kommandozeile laufen.

momentan arbeite ich unter WinXP könnte aber auch Linux booten. Aber das OS sollte ja eigentlich egal sein.

Vielen Dank.

Gruß
Pfanni

anda_skoa
10-03-2003, 09:31
Das Datum inklusive Uhrzeit, erhälts du über den Calendar



import java.util.Calendar;
import java.util.Date;

Calendar cal = Calendar.getInstance();
Date date = cal.getTime();


Ciao,
_

Pfanni
10-03-2003, 13:59
Danke für den Tipp mit dem Calender.

hab es so eingebunden und auch mal mit System.out.println ausgeben lassen.
Aber wie bekomme ich da denn jetzt einen bestimmten Eintrag raus, mit dem ich dann weiter arbeiten kann.
Also ich bräuchte z.B. nur das Jahr in einem String oder Array o.ä., da ich so was in der Richtung basteln will wo ich frage ob das Jahr stimmt oder nicht........
Danke.

Pfanni

fs111
10-03-2003, 14:48
Also ich habe hier eine Klasse (ich glaube die ist aus Core Java), die kan sehr gut mit Daten umgehen. Die kann auch die Tage zwischen zwei Daten berechen, ein normales deutsches Datum in ein SQL konformes Datum umwandeln und noch viel mehr. Damit programmiert es sich viel einfacher als mit den schrecklichen Klassen von Sun, vor allem GregoriaCalendar ist so eine Krux, die man gar nicht benutzen möchte.

Wenn Du willst schicke ich Sie Dir zu.

Grüße fs111

Pfanni
10-03-2003, 15:32
@fs11
würde mich sehr über die Klasse freuen. Die Frage ist nur ob ich auch damit umgehen kann. Vielleicht könntest mir ein kleines BSP mitschicken. Wäre nett.
Danke.

Gruß
Pfanni

anda_skoa
10-03-2003, 15:38
Original geschrieben von Pfanni

Also ich bräuchte z.B. nur das Jahr in einem String oder Array o.ä., da ich so was in der Richtung basteln will wo ich frage ob das Jahr stimmt oder nicht........


Dazu mein Tipp: in der Doku nachschaun :)



Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);


Calendar arbeitet über Konstanten, die am Anfang in der Doku beschrieben sind, zum Beispiel eben Calendar.YEAR

Ciao,
_

fs111
10-03-2003, 16:50
Hier nun also der Quellcode der Day Klasse:


import java.util.*;
import java.io.*;
import java.lang.Math;


public class Day
{

private int day = 0;
private int month = 0;
private int year = 0;


/**
* Constructs a today's date
*/
public Day()
{
GregorianCalendar todaysDate = new GregorianCalendar();
year = todaysDate.get(Calendar.YEAR);
month = todaysDate.get(Calendar.MONTH) + 1;
day = todaysDate.get(Calendar.DAY_OF_MONTH);

}//constructor



/**
* Constructs a specific date
*
* @param yyyy year (full year, e.g., 1996,
* <i>not</i> starting from 1900)
* @param m month
* @param d day
* @exception IllegalArgumentException if yyyy m d not a
* valid date
*/

public Day(int yyyy, int m, int d)
throws IllegalArgumentException
{
year = yyyy;
month = m;
day = d;

if (!isValid())
throw new IllegalArgumentException();

}//constructor


/**
* Constructs a specific date from a String. The String must be in
* format (D)D.(M)M.YYYY
*
* @param a String representation of a Date
* @exception IllegalArgumentException if yyyy m d not a
* valid date
*/

public Day(String dString)
throws IllegalArgumentException
{
int index = 0;
int oldindex = 0;

try
{
index = dString.indexOf('.',oldindex);
day = Integer.parseInt( dString.substring(oldindex,index) );

oldindex = index+1;
index = dString.indexOf('.',oldindex);
month = Integer.parseInt( dString.substring(oldindex,index) );

oldindex = index +1;
year = Integer.parseInt( dString.substring(oldindex,dString.length() ) );
}
catch (IndexOutOfBoundsException e)
{
//do nothing, because IllegalArgumentException is thrown below instead
}


if (!isValid() || dString.substring(oldindex,dString.length()).lengt h() != 4 )
throw new IllegalArgumentException();

}//constructor



/**
* Constructs a specific date from a String.
* If SQLTimestamp is false, the String must be in
* format (D)D.(M)M.YYYY
* If SQLTimestamp is true, the String must be in
* format YYYY-MM-DD HH.MM.SS
* The Daytime information will be ignored then
*
* @param a String representation of a Date
* @param format of the Date string
* @exception IllegalArgumentException if yyyy m d not a
* valid date
*/

public Day(String dString, boolean SQLTimestamp)
throws IllegalArgumentException
{
int index = 0;
int oldindex = 0;

try
{
if (SQLTimestamp) { //if dString is a timestamp, rewrite it to DD.MM.YYYY

String newstr="";
newstr+=dString.substring(8,10) +".";
newstr+=dString.substring(5,7) +".";
newstr+=dString.substring(0,4);

dString=newstr; //assign dString the value of the rewritten date string
}

index = dString.indexOf('.',oldindex);
day = Integer.parseInt( dString.substring(oldindex,index) );

oldindex = index+1;
index = dString.indexOf('.',oldindex);
month = Integer.parseInt( dString.substring(oldindex,index) );

oldindex = index +1;
year = Integer.parseInt( dString.substring(oldindex,dString.length() ) );
}
catch (IndexOutOfBoundsException e)
{
//do nothing, because IllegalArgumentException is thrown below instead
}

if (!isValid() || dString.substring(oldindex,dString.length()).lengt h() != 4 )
throw new IllegalArgumentException();

}//constructor




/**
* Gets the day of the month
*
* @return the day of the month (1...31)
*
*/

public int getDay()
{
return day;
}//getDay



/**
* Gets the month
*
* @return the month (1...12)
*
*/

public int getMonth()
{
return month;
}//getMonth



/**
* Gets the year
*
* @return the year (counting from 0, <i>not</i> from 1900)
*
*/

public int getYear()
{
return year;
}//getYear



/**
* Returns SQL compliant String representation of the day (YYYY-MM-DD)
*
* @return a string representation of the day
*
*/

public String toString()
{

return toSQLDate();
}//toString


/**
* Returns String representation of the day (DD.MM.YYYY)
* if normalDate is true, otherwise result is an SQL Date String
*
* @return a string representation of the day
*
*/
public String toString(boolean normalDate)
{
if (!normalDate)
return toSQLDate();
else
return day+"."+month+"."+year;
}//toString

/**
* Returns an SQL comliant DATE String
*
* @return an SQL comliant DATE String
*
*/
public String toSQLDate() {

String retval = "";
if (Math.abs(year) < 1000)
retval +="0";
if (Math.abs(year) < 100)
retval +="0";
if (Math.abs(year) < 10)
retval+="0";
retval +=year +"-";

if (month < 10)
retval+="0";
retval+= month +"-";

if (day < 10)
retval+="0";
retval+= day;

return retval;

}//toSQLDate


/**
* Compares this Day against another object
*
* @param obj another object
* @return true if the other object is identical to this Day object
*
*/

public boolean equals(Object obj)
{
if (!getClass().equals(obj.getClass()))
return false;

Day b = (Day)obj;
return day == b.day && month == b.month && year == b.year;
}//equals


//advances the date by the submitted number of days
//(may also be negative value)
public void advanceDate(int days) {
fromJulian(toJulian()+days);

}//moveDays


/**
* Calculates the number of days between this day and the
* submitted day.
*
* @param b any date
* @return the number of days between this day and b
* ( > 0 if this day comes after b )
*/

public int daysBetween(Day b)
{
return toJulian() - b.toJulian();

}//daysBetween



/*
* Computes the number of days between two dates
*
* @return true if this is a valid date
*/

public boolean isValid()
{
Day t = new Day();
t.fromJulian(this.toJulian());

return (t.day == day && t.month == month
&& t.year == year);
}//isValid


/*
* Converts a day to the julian calendar.
*
* @return The Julian day number that begins at noon of this day.
* Positive year signifies A.D., negative year B.C.
* Remember that the year after 1 B.C. was 1 A.D.
*
* A convenient reference point is that May 23, 1968 noon
* is Julian day 2440000.
*
* Julian day 0 is a Monday.
*
* This algorithm is from Press et al., Numerical Recipes
* in C, 2nd ed., Cambridge University Press 1992
*/

public int toJulian()
{
int jy = year;

if (year < 0) jy++;
int jm = month;

if (month > 2)
jm++;

else
{
jy--;
jm += 13;
}

int jul = (int) (java.lang.Math.floor(365.25 * jy)
+ java.lang.Math.floor(30.6001*jm) + day + 1720995.0);

// Gregorian Calendar adopted Oct. 15, 1582
int IGREG = 15 + 31*(10+12*1582);

// change over to Gregorian calendar
if (day + 31 * (month + 12 * year) >= IGREG)
{
int ja = (int)(0.01 * jy);
jul += 2 - ja + (int)(0.25 * ja);
}

return jul;

}//toJulian



/**
* Converts a Julian day to a calendar date
*
* This algorithm is from Press et al., Numerical Recipes
* in C, 2nd ed., Cambridge University Press 1992
*
* @param j the Julian date
*/

public void fromJulian(int j)
{
int ja = j;

//the Julian date of the adoption of the Gregorian calendar
int JGREG = 2299161;

//cross-over to Gregorian Calendar produces this correction
if (j >= JGREG)
{
int jalpha = (int)(((float)(j - 1867216) - 0.25) / 36524.25);
ja += 1 + jalpha - (int)(0.25 * jalpha);
}

int jb = ja + 1524;
int jc = (int)(6680.0 + ((float)(jb-2439870) - 122.1)/365.25);
int jd = (int)(365 * jc + (0.25 * jc));
int je = (int)((jb - jd)/30.6001);
day = jb - jd - (int)(30.6001 * je);
month = je - 1;
if (month > 12) month -= 12;
year = jc - 4715;
if (month > 2) --year;
if (year <= 0) --year;

}//fromJulan


}//Day

Du kanns einfacht mit Day myDay = new Day ein neues Objekt dieses Typs erzeugen, welches das aktuelle Datum enthält. Außerdem kanns Du auch mit Day(TT.MM.YYYY) oder Day(SQLDATUM) neue Day Objekte erzeugen. Die Klasse ist insgesamt sehr gut dokumentiert, und sollte eigentlich so verständlich sein. Mir hat sie vorallem im Zusammenspiel mit einer DB geholfen, weil man ganz einfach Daten ins SQL-Format übertragen kann, und einem insgesamt viel Arbeit abgenommen wird.

Grüße fs111

peschmae
10-03-2003, 18:28
pffff,

da stimme ich doch lieber für anda_skoas Variante und ein bisschen Javadoc lesen ... - wenn du mal weisst, wie die benötigte Klasse heisst, steht dort nämlich meist fast alles drin, was du brauchst

MfG Peschmä

fs111
10-03-2003, 18:51
Was bitte soll denn daran toller sein sich mit so unlogischen Konstrukten, wie etwa dass Monate ab 0 gezählt werden, Tage higegen nicht. Da ist diese Klasse um längen besser. Auch wenn man viel mit DB und Daten (also Plural von Datum) macht, ist dies Klasse unschlagbar. Außerdem ist es ja auch der Sinn von OO zu abstrahieren und mit Objekten zu arbeiten, und das genau macht man ja dann mit den Objekten.

fs111

anda_skoa
10-03-2003, 21:01
Was an der Klasse auf jedenfall problematisch ist, ist der hardcodierte Gregorian Calendar.

Sobald der nicht dem Calendar der Locale entspricht, ist die Klasse unbrauchbar.
Schwer zu finden, wenn man ein Programm ausgeliefert hat.

Außerdem hätte man wahrscheinlich auch von Date ableiten können.

So muss man für alle Formatierer neu schreiben.

Ciao,
_

fs111
11-03-2003, 00:51
Wo siehst Du da denn Probleme? Wenn ich eine online Anwendung habe, dann ist ja für den Betreiber die Zeit/das Datum an seinem Ort interessant, und wenn es eine Anwendung auf der Maschine des Benutzers ist, dann stimmt das Datum ja ohnehin. Wo sollte da was schief laufen?

fs111

pulp
11-03-2003, 03:18
hat nix mit dem thema zu tun:

aber nen post mit [java] oder [c] [c++] zu starten, ist ne gute idee.
dann weiß jeder gleich mit was er es zu tun hat.

könnte man ja als "codex" festlegen.

*gradzuspäterstundeaufgefallen*

pulp

Pfanni
11-03-2003, 09:50
@ fs111
vielen Dank für deine Hilfe mit der Klasse. Hab damit jetzt mal etwas rumgespielt und komme damit soweit zurecht. Als Newbie versteh ich eh so einige Zusammenhänge noch nicht, weshalb für mich die JAVA-Docu (http://java.sun.com/j2se/1.4.1/docs/index.html) an sich tlw. doch recht unverständlich ist. Aber das wird schon noch.....jeder fängt mal klein an.

@all
Hab jetzt für meine Frage zwei Lösungsansätze gefunden. Einmal ohne der Klasse von fs111 und einmal mit.

Werft doch bitte nochmal einen Blick drauf uns sagt mir ob das zu umständlich ist. Mit dem String hab ich gearbeitet, da ich an die Einzelziffern des Jahres mit charAt(3) ran will um damit z.B. zu rechnen.

mit der Klasse von fs111:


Day myDay = new Day();

int test = myDay.getYear();
String ziffer4 = ""+ test;
System.out.println("Jahr-String: "+ ziffer4);
System.out.println("letzte Jahresziffer: " + ziffer4.charAt(3));





GregorianCalendar todaysDate = new GregorianCalendar();
int year = todaysDate.get(Calendar.YEAR);
System.out.println("GregorianCalendar - Typ: " +year);

String test = "" +year;
System.out.println("Jahr-String: " +test);
System.out.println("Jahr-String 4te Ziffer: " +test.charAt(3));


Gruß
Pfanni

peschmae
11-03-2003, 13:25
@fs111


Was bitte soll denn daran toller sein sich mit so unlogischen Konstrukten, wie etwa dass Monate ab 0 gezählt werden, Tage higegen nicht.

Ich hab nie gesagt, dass ich unlogiken wie diese toll finde, nur:
Wenn man in einem Programm irgendwo mal _ein_ Datum braucht, dann ist diese Klasse Overhead und die direkte Verwendung der API imho einfacher. Falls du das ganze Programm hindurch nur mit daten herumbastelst, mag das was anderes sein...

Wenn du für jede unlogik eine solche, durchaus praktische Klasse basteln würdest ...


MfG Peschmä

peschmae
11-03-2003, 13:36
Ich glaub das ist das einfachste, allerdings kannst du das alles zusammennehmen, etwa so (ungetestet):


(new GregorianCalendar()).todaysDate.get(Calendar.YEAR) .toString().charAt(3));

MfG Peschmä

fs111
11-03-2003, 13:42
Original geschrieben von peschmae
@fs111



Ich hab nie gesagt, dass ich unlogiken wie diese toll finde, nur:
Wenn man in einem Programm irgendwo mal _ein_ Datum braucht, dann ist diese Klasse Overhead und die direkte Verwendung der API imho einfacher. Falls du das ganze Programm hindurch nur mit daten herumbastelst, mag das was anderes sein...

Wenn du für jede unlogik eine solche, durchaus praktische Klasse basteln würdest ...


MfG Peschmä

Ich habe ja auch schon mehrfach erwähnt, dass sich diese Klasse hervorragend eignet, wenn man mit vielen Daten und auch im Zusammenspiel mit SQL arbeiten muss. Ich habe letztens (Gruppenarbeit) in der Uni eine Online Bibliothek mit Leihsystem, Mahnsystem, Kunden- und Medienverwaltung in Java Servlets geschrieben, und da kommen so viele Datumsoperationen vor, dass man echt froh ist, wenn man eine solche Klasse hat.

Grüße fs111

anda_skoa
11-03-2003, 13:45
Die letzte Stelle der Jahreszahl:



int year3 = Calendar.getInstance().get(Calendar.YEAR) % 1000;


@pfanni: Wenn du zb aus einer Zahl einen String erzeugen willst, dann versuche zuerst eine geeignete Methode der Klasse String zu finden, in diesem Fall
valueOf(int)

Die Konkatenation mit "" funktioniert zwar, ist aber "Teuer", d.h. es braucht unnötig Resourcen, weil zuerst "" angelegt wird, dann ein String mit der Zahl, dann ein String, der beide enthält.

Das sind drei String Objekte, von denen dann zwei wieder vom Garbage Collector eingesammelt werden müssen.

Ciao,
_

anda_skoa
11-03-2003, 13:47
Original geschrieben von fs111
Wo siehst Du da denn Probleme? Wenn ich eine online Anwendung habe, dann ist ja für den Betreiber die Zeit/das Datum an seinem Ort interessant, und wenn es eine Anwendung auf der Maschine des Benutzers ist, dann stimmt das Datum ja ohnehin. Wo sollte da was schief laufen?




new GregorianCalendar();


Preisfrage: was passiert, wenn der Calendar in der Locale des Benutzer kein GregorianCalendar ist?

Ciao,
_

Pfanni
11-03-2003, 14:39
@anda_skoa
wie genau hätte ich mir mit diesem valueOf(int) denn meine Konstruktion mit den beiden "" sparen können?
Hab mal in JAVA Docu geschaut und da steht zu dieser Methode folgender Satz drin "Returns the string representation of the int argument"
Soweit ich das verstehe kann ich mir damit aus einem bestehenden String eine Stelle rauspicken und in einen neuen String stecken. Meine Konstruktion mit den "" hat aber doch erst mal einen ersten String mit der Zahl als Inhalt erstellen müssen. Ich bräuchte also eine Vereinfachung wie ich > int in String < umwandle.

hab mal folgendes getestet:


String y = "" +year;
String testvalue = y.valueOf(3);
System.out.println("Test mit Value: " +testvalue);

da bekomme ich dann als Ausgabe eine "3" wenn "int year=2003" war.

Oder hab ich da jetzt ganz am Ziel vorbei geschossen und du wolltest mir was anderes sagen?

cu
Pfanni

anda_skoa
11-03-2003, 17:51
Original geschrieben von Pfanni
Ich bräuchte also eine Vereinfachung wie ich > int in String < umwandle.


Genau das macht valueOf

Die String Repräsentation ist ja genau das was du suchst :)



String y = String.valueOf(year);


Eine andere Möglichkeit ist die Klasse Integer



String y = Integer.toString(year);


Und wenn du vorher das Jahr module 1000 rechnest (Der Rest der Division durch 1000), dann enthält der String y gleich nur die letzte Zahl



String y = String.valueOf( year % 1000 );


Ciao,
_

Pfanni
11-03-2003, 18:41
@anda_skoa
vielen Dank für dei erneute Hilfe :):)
Da wäre ich alleine nie drauf gekommen. Aber ich stehe ja noch am Anfang, mit der Zeit werde ich das schon noch gebacken kriegen (muss ich ja schließlich sonst bekomme ich noch Probs mit meinem Prof;))

Gruß
Oceanman

fs111
12-03-2003, 09:45
Original geschrieben von anda_skoa


new GregorianCalendar();


Preisfrage: was passiert, wenn der Calendar in der Locale des Benutzer kein GregorianCalendar ist?

Ciao,
_

Ich verstehe Dein Problem immer noch nicht. Wieso sollte es kein Gregorian Calendar sein?

Gruß

fs111

peschmae
12-03-2003, 13:28
@anda_skoa:

Und wenn du vorher das Jahr module 1000 rechnest (Der Rest der Division durch 1000), dann enthält der String y gleich nur die letzte Zahl

dann aber doch lieber modulo 10, oder?
Du kannst ja nicht davon ausgehen, dass das Programm vor 2010 verschrottet wird, und die letzte ziffer kriegst du dann so nicht mehr - ok, das kommt auch darauf an, was du (bzw er) eigentlich genau will(st)


@fs111:

Ich verstehe Dein Problem immer noch nicht. Wieso sollte es kein Gregorian Calendar sein?
Muss ja nicht unbedingt...
Allerdings ist dann der Code für die letzte Ziffer auch recht schwer zu schreiben, da z. B. der jüdische Kalender irgendwo beim Jahr 5000 steckt

MfG Peschmä

fs111
12-03-2003, 13:58
OK, sicherlich gibt es noch andere Datumszählungen, als unsere (jüdische, chiniesischen, etc.), aber man sollte doch wohl bei einer Anwendung davon ausgehen, dass sie den weltweiten Standard des westlichen Kalenders verwendet. Ich kann mir nicht vorstellen, dass bspw. Webserver in Israel mit jüdischem Datum laufen, das ist ganz sicher alles auf "unser" Datum genormt. Das würde ja auch sonst ein ganz schönes durcheinander geben...

fs111

peschmae
12-03-2003, 14:07
schon so, aber es geht ja nicht zwingend nur um Webserver, aber grundsätzlich haste recht

MfG Peschmä

anda_skoa
12-03-2003, 14:51
Original geschrieben von peschmae
@anda_skoa:

dann aber doch lieber modulo 10, oder?
Du kannst ja nicht davon ausgehen, dass das Programm vor 2010 verschrottet wird, und die letzte ziffer kriegst du dann so nicht mehr - ok, das kommt auch darauf an, was du (bzw er) eigentlich genau will(st)


Du hast recht, Modulo 10 natürlich.



Muss ja nicht unbedingt...
Allerdings ist dann der Code für die letzte Ziffer auch recht schwer zu schreiben, da z. B. der jüdische Kalender irgendwo beim Jahr 5000 steckt


Nichts deso trotz ist die letzte Ziffer immer das Modulo 10 Ergebnis.

Ciao,
_

anda_skoa
12-03-2003, 14:53
Original geschrieben von fs111
OK, sicherlich gibt es noch andere Datumszählungen, als unsere (jüdische, chiniesischen, etc.), aber man sollte doch wohl bei einer Anwendung davon ausgehen, dass sie den weltweiten Standard des westlichen Kalenders verwendet. Ich kann mir nicht vorstellen, dass bspw. Webserver in Israel mit jüdischem Datum laufen, das ist ganz sicher alles auf "unser" Datum genormt. Das würde ja auch sonst ein ganz schönes durcheinander geben...


Du hast recht, sollen sich gefälligst alle nach uns richten.
Wer braucht schon i18n und l10n

Am Besten wir definieren alle nicht ASCII Zeichen auch gleich als ungültig.
Ah, das muss natuerlich dann ungueltig heissen, Umlaute gibts ja im normalen 127bit ASCII nicht, aber wer braucht die schon.
Selber schuld, wenn man andere Zeichen in der Sprache hat.

Ciao,
_

fs111
12-03-2003, 18:00
Was hat denn bitte ein Zeichensatz mit dem Datumsformat zu tun? Du weichst meiner Nachfrage aus. Du willst mir also sagen, dass ich mein Java VM bspw. in Israel keinen Gregorian Calendar bietet, oder wie?

fs111

anda_skoa
12-03-2003, 18:23
Original geschrieben von fs111
Was hat denn bitte ein Zeichensatz mit dem Datumsformat zu tun? Du weichst meiner Nachfrage aus. Du willst mir also sagen, dass ich mein Java VM bspw. in Israel keinen Gregorian Calendar bietet, oder wie?


Nein, die JVM kenn immer einen GregorianCalendar.

Mein vorheriges Posting soltle nur zeigen, was die Grundaussage ist, wenn man auf Internationalization und Localization per definitionem verzichtet, weil "eh alle meine Settings benutzen"

Das ist, so finde ich zumindest, eine ziemlich arrogante Anmaßung. :mad:

Wir als deutschsprachige Europäer haben einfach Glück, dass praktisch alle Basistechnologien für unseren Kutlurkreis entwickelt wurden und unsere Sprache wenig Abweichungen von Englisch aht und darum im ertweiterten ASCII enthalten ist.

Wenn der Aufwand für eine korrekte Lösung sehr hoch ist, kann man schon eine weiger optimale Lösung machen, solange man sich bewußt ist, dass man sich auf eine bestimmte Untermenge aller Locales einschränkt.

Java bietet praktisch für alle problematischen Bereiche Fectories oder Factorymethden, um die Erzeugung korrekter Objekte zu vereinfachen.

Im Falle des Calendars gibt es drei Factory Methoden, die drei Versionen von getInstance.

Mir kann wirlich niemand erzählen, dass


Calendar cal = Calendar.getInstance();

so viel komplizierter als


Calendar cal = new GregorianCalendar();

ist, dass es die Festlegung auf diesen speziellen Calendar rechtfertigen würde.

Eigentlich halte ich die allgemeine Variante sogar für einfacher.

Ciao,
_

fs111
12-03-2003, 19:27
Hier maßt sich keiner etwas an! Wenn Du so argumentierst, dann möchte ich aber bitte auch an meiner Datenbank immer mein deutsches Datum eingebn können, das ist ja wohl eine riesen Sauerei, dass ich mich da umstellen muss!

Nein mal im Ernst, es gibt nun mal Einschränkungen, mit denen man leben muss. Ich verlange ja auch nicht, dass mein BIOS einen dt. Zeichensatz auf der Tastatur hat.

Ich habe ja schon mehrfach beschrieben, in wie weit diese Klasse vorallem in der Zusammenarbeit mit einer DB hilfreich ist. Eine DB wird immer ihr Datum verlangen, also habe ich hier eine Klasse, wo ich _mein_ Datum oben reinschmeiße, und es unten SQL konform rauskommt. Außerdem kann diese Klasse den Intervall zwischen zwei Tagen berechen, und noch vieles mehr. Also mach das Teil hier nicht so schlecht. Diese Klasse macht einem das Leben wirklich einfacher. Ich weiß ja nicht, wie viel Du schon mit Datumsberechnungen gearbeitet hast, aber das kann einem echt den letzten Nerv rauben, wenn man versucht sowas alles zu Fuß zu implementieren. Außerdem wird der Ursprungsposter ja wohl kaum schon nächste Woche das Mega Riesen Projekt programmieren, welches in 153 verschiedenen Sprachen erscheint, und 12 verschieden Datumsformate/Zählweisen abfangen muss.

Ich habe nur gesagt, dass es einem einfacher gemacht wird, und ich finde diese Klasse weiterhin sehr gut!

fs111

anda_skoa
12-03-2003, 20:50
Original geschrieben von fs111
Hier maßt sich keiner etwas an! Wenn Du so argumentierst, dann möchte ich aber bitte auch an meiner Datenbank immer mein deutsches Datum eingebn können, das ist ja wohl eine riesen Sauerei, dass ich mich da umstellen muss!


Sag ich doch.
Backend und Userinterface können das selbe Datum anders darstellen, wenn das Userinterface gewzungen wird, die interne Repräsentation zu verwenden, ist das, wei du ja selber sagst, eine Sauerei :)



Nein mal im Ernst, es gibt nun mal Einschränkungen, mit denen man leben muss. Ich verlange ja auch nicht, dass mein BIOS einen dt. Zeichensatz auf der Tastatur hat.


Du hast den Teil gelesen, wo etwas über den Aufwand stand?



Also mach das Teil hier nicht so schlecht.


Ich hab hier fast nix schlechtes über die Klasse gesagt, bis aus das sie nicht von Date abgeleitet ist und man darum die DateFormatter nicht benutzen kann.

Das was ich "schlecht gemacht" habe, ist das hardcodieren eines Kalenders.



Außerdem wird der Ursprungsposter ja wohl kaum schon nächste Woche das Mega Riesen Projekt programmieren, welches in 153 verschiedenen Sprachen erscheint, und 12 verschieden Datumsformate/Zählweisen abfangen muss.


Und es ist wirklich besser, ihm gleich was suboptimales beizubringen, das er ohne Mehraufwand auch besser haben könnte?

So nach dem Motto: "ich weiß wie es geht, schreib dir aber nur einen Hack, weil du sollst selber auf die Schnauze fallen und es auf die harte Tour lernen"

Hmm, muss ich mir überlegen.

Ciao,
_

anda_skoa
12-03-2003, 21:02
Original geschrieben von fs111

Ich habe ja schon mehrfach beschrieben, in wie weit diese Klasse vorallem in der Zusammenarbeit mit einer DB hilfreich ist. Eine DB wird immer ihr Datum verlangen, also habe ich hier eine Klasse, wo ich _mein_ Datum oben reinschmeiße, und es unten SQL konform rauskommt.

Ich hab mir das jetzt nochmal angesehen.
Das "SQLFormat" ist ein normaler String formatiert nach ISO8601

Kann zum Formatiern von Datum nur wieder auf die Klasse SimpleDateFormat verweisen.
Die kann das nämlich im Schlaf in beide Richtungen, mit einem java.util.Date als Parameter bzw Rückgabewert.

Also, das einzige was die Klasse neu macht, ist die Differenzbrechnung.
Ah, und +1 beim Monat zu addieren.

Ciao,
_

Pfanni
12-03-2003, 22:24
Original geschrieben von fs111
(...)Außerdem wird der Ursprungsposter ja wohl kaum schon nächste Woche das Mega Riesen Projekt programmieren, welches in 153 verschiedenen Sprachen erscheint, und 12 verschieden Datumsformate/Zählweisen abfangen muss.


das meinst du, ich bin schon in Verhandlungen über den weltweiten Verkauf und Übersetzung der Oberfläche ;)

ne im Ernst ich wollte einfach vom Jahr 2003 z.B. die Zahl 3 oder meinetwegen auch die 2 einzeln in nem int haben und damit rumrechnen. Um richties Datum gehts mir im Moment noch gar nicht.......kommt wohl erst noch in der Zukunft, deine Klasse hebe ich mir aber auf jeden Fall mal auf. Wer weiss ob ich die nicht mal gut gebrauchen kann.


cu
Pfanni

fs111
13-03-2003, 08:46
Original geschrieben von anda_skoa
Ich hab mir das jetzt nochmal angesehen.
Das "SQLFormat" ist ein normaler String formatiert nach ISO8601

Kann zum Formatiern von Datum nur wieder auf die Klasse SimpleDateFormat verweisen.
Die kann das nämlich im Schlaf in beide Richtungen, mit einem java.util.Date als Parameter bzw Rückgabewert.

Also, das einzige was die Klasse neu macht, ist die Differenzbrechnung.
Ah, und +1 beim Monat zu addieren.

Ciao,
_

OK; in Zukunft werde ich hier nichts mehr posten, denn Herr anda_skoa kennt ja für alles eine bessere Lösung, auch wenn er es noch nie benutzt hat.

fs111

anda_skoa
13-03-2003, 10:16
Original geschrieben von fs111
OK; in Zukunft werde ich hier nichts mehr posten, denn Herr anda_skoa kennt ja für alles eine bessere Lösung, auch wenn er es noch nie benutzt hat.


Ich kenn nich für alles eine besser Lösung, aber wenn ich einen zusätzlichen Hinweis für angebracht halte, dann poste ich den auch.

In diesem Fall, dass hardcoden von Locale abhängigen Klassen problematisch ist.

Ciao,
_

peschmae
13-03-2003, 11:36
@anda_skoa

<quote>
quote:
--------------------------------------------------------------------------------

Muss ja nicht unbedingt...
Allerdings ist dann der Code für die letzte Ziffer auch recht schwer zu schreiben, da z. B. der jüdische Kalender irgendwo beim Jahr 5000 steckt

--------------------------------------------------------------------------------

Nichts deso trotz ist die letzte Ziffer immer das Modulo 10 Ergebnis.

</quote>

ok, hab mich da vielleicht etwas unglücklich ausgedrückt. Allerdings kommt es immer darauf an, was man damit machen will bzw. was die letzte ziffer im jeweiligen Datumsformat denn bedeutet ...
Im übrigen bezog sich das ja noch auf den String, was ein

.....toString().substring(....toString.length()-1) oder so erfordert hätte, um das zeugs von der Stringlänge unabhängig zu machen...

@fs111
Ist denn das ein Grund!?

MfG Peschmä