[JAVA] Datum controleren

Pagina: 1
Acties:
  • 246 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Priet
  • Registratie: Januari 2001
  • Laatst online: 06-06 23:37

Priet

To boldly do what no one has..

Topicstarter
Ik heb geprobeerd om met behulp van de klasse Calendar een methode te maken die controleert of een datum correct is (dus niet iets al 40 april oid). Maar op de een of andere manier wil het echt niet werken.

Dit is wat ik heb:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import java.io.*;
import java.util.*;

class Main
{
  public static void main(String[] arg) throws IOException
  {
    BufferedReader myIn = new BufferedReader (new InputStreamReader (System.in));
    String strDag, strMaand, strJaar;

    // Vraag datum op
    System.out.print("Geef dag in max. 2 cijfers: "); System.out.flush();
    strDag = myIn.readLine();
    System.out.print("Geef maand in max. 2 cijfers: "); System.out.flush();
    strMaand = myIn.readLine();
    System.out.print("Geef jaar in max. 2 cijfers: "); System.out.flush();
    strJaar = myIn.readLine();

    // Parse datum naar Integers
    int intDag, intMaand, intJaar;
    intDag = Integer.parseInt(strDag);
    intMaand = Integer.parseInt(strMaand);
    intJaar = Integer.parseInt(strJaar);

    // Invullen in Calendar object
    Kalender kalender = new Kalender();
    System.out.println(kalender.checkDate(intDag, intMaand, intJaar));
  }
}

import java.util.*;

class Kalender extends Calendar
{
  public Kalender()
  {
  }

  public boolean checkDate(int dag, int maand, int jaar)
  {
    boolean value = true;

    try
    {
      setLenient(false);
      set(jaar, maand, dag);
    }
    catch (Exception e)
    {
      value = false;
    }

    return value;
  }

  // Abstract methods of class Calendar
  public void add(int field, int amount) { }
  public void computeFields() { }
  public void computeTime() { }
  public int getLeastMaximum(int field) { return -1; }
  public int getGreatestMinimum(int field) { return -1; }
  public int getMaximum(int field) { return -1; }
  public int getMinimum(int field) { return -1; }
  public void roll(int field, boolean up) { }
}

Ik heb het een en ander opgezocht, en het blijkt dat de set() methode van Calendar een exception moet genereren als er een foutieve datum is ingevoerd, mits de lenient op false staat. Maar wat ik ook probeer aan incorrecte data op te geven, de methode geeft geen exception :(

Iemand enig idee :?

[ Voor 6% gewijzigd door Priet op 27-05-2003 18:16 ]

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


Acties:
  • 0 Henk 'm!

  • Reefer
  • Registratie: Mei 2000
  • Laatst online: 21-02 01:41

Reefer

madness

in de api staat de functie set(int year, int month, int date, int hour, int minute, int second)
dus eerst jaar dan maand en dan dag

A Breakbeat A Day Keeps Religion Away.


Acties:
  • 0 Henk 'm!

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 07-10-2022
Wat denk je ervan om een kalendar implementatie te gebruiken? GregorianCalendar bijvoorbeeld als jij data in de gregorian calendar wilt controleren. Calendar is een abstracte klasse voor kalenders, welke dus onafhankelijk van specifieke kalendar systemen is.

Het is ook onzinnig om Calendar even te veranderen in GregorianCalendar: je maakt dan geen goed gebruik van inheritance. Je wilt gewoon moet een Calendar werken, waarom maak je dan gelijk een subklasse?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Acties:
  • 0 Henk 'm!

  • Priet
  • Registratie: Januari 2001
  • Laatst online: 06-06 23:37

Priet

To boldly do what no one has..

Topicstarter
Reefer schreef op 27 mei 2003 @ 14:55:
in de api staat de functie set(int year, int month, int date, int hour, int minute, int second)
dus eerst jaar dan maand en dan dag
Ja sorry, dat was nog een restantje van wat probeersels omdat ie het niet goed deed :Y) Is inmiddels al veranderd :) Dit lost helaas niet het probleem op.

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


Acties:
  • 0 Henk 'm!

  • Priet
  • Registratie: Januari 2001
  • Laatst online: 06-06 23:37

Priet

To boldly do what no one has..

Topicstarter
mbravenboer schreef op 27 May 2003 @ 14:56:
Wat denk je ervan om een kalendar implementatie te gebruiken? GregorianCalendar bijvoorbeeld als jij data in de gregorian calendar wilt controleren. Calendar is een abstracte klasse voor kalenders, welke dus onafhankelijk van specifieke kalendar systemen is.

Het is ook onzinnig om Calendar even te veranderen in GregorianCalendar: je maakt dan geen goed gebruik van inheritance. Je wilt gewoon moet een Calendar werken, waarom maak je dan gelijk een subklasse?
Uhhh daar heb ik eigenlijk geen goed antwoord voor :7
Maar bedankt, ik ga die implementatie eens proberen. Eens kijken of ik daar wat mee verder kom.

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"


Acties:
  • 0 Henk 'm!

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

code:
1
2
3
4
5
6
7
8
9
    public static void checkValidateDate(GregorianCalendar date) throws BadDateException {
        date.setLenient(false);

        try {
            date.getTime();
        } catch (IllegalArgumentException e) {
            throw new BadDateException("bla");
        }
    }

[ Voor 13% gewijzigd door Alarmnummer op 27-05-2003 15:10 ]


Acties:
  • 0 Henk 'm!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17:40

Robtimus

me Robtimus no like you

Dit heb ik zelf al eens moeten doen.
Ervan uitgaande dat je ints year, month en day hebt:
Java:
1
2
3
4
5
GregorianCalendar greg = new GregorianCalendar(year, month - 1, day);
int gregyear = greg.get(GregorianCalendar.YEAR);
int gregmonth = greg.get(GregorianCalendar.MONTH);
int gregday = greg.get(GregorianCalendar.DATE);
return ((year == gregyear) && (month == gregmonth + 1) && day == gregday));
Wat ik hier doe: maak een calender met de huidige datum (die kan dus fout zijn). GregorianCalendar fixed het intern automatisch. Haal dan de gefixte jaar, maand en dag terug en kijk of ze gelijk zijn aan de voorgaande (denk eraan dat maand van 0-11 loopt). Zo nee, dan was de datum fout.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • Priet
  • Registratie: Januari 2001
  • Laatst online: 06-06 23:37

Priet

To boldly do what no one has..

Topicstarter
Dank u allen, met jullie hulp ben ik tot een oplossing gekomen. Ik zal 't voor het gemak maar posten voor diegene die het misschien ooit nodig mocht hebben.

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
import java.io.*;
import java.util.*;

class Main
{
  public static void main(String[] arg) throws IOException
  {
    BufferedReader myIn = new BufferedReader (new InputStreamReader (System.in));
    int intDag, intMaand, intJaar;
    boolean geldigeDatum;

    do
    {
      // Vraag datum op
      System.out.print("Geef dag in max. 2 cijfers: "); System.out.flush();
      intDag = Integer.parseInt(myIn.readLine());
      System.out.print("Geef maand in max. 2 cijfers: "); System.out.flush();
      intMaand = Integer.parseInt(myIn.readLine());
      System.out.print("Geef jaar in 4 cijfers: "); System.out.flush();
      intJaar = Integer.parseInt(myIn.readLine());

      if (!(geldigeDatum = KalenderFuncties.isDate(intDag, intMaand, intJaar)))
        System.out.println("\n" + intDag + "-" + intMaand + "-" + intJaar
         + " is een ongeldige datum, probeer opnieuw:");

    } while (!geldigeDatum);

    String strDatum = intDag + "-" + intMaand + "-" + intJaar;
    System.out.println(KalenderFuncties.isDate(strDatum));
    System.out.println(KalenderFuncties.getDay(strDatum));
    System.out.println(KalenderFuncties.getMonth(strDatum));
    System.out.println(KalenderFuncties.getYear(strDatum));
    System.out.println(KalenderFuncties.getDay(intDag, intMaand, intJaar) 
        + " " + intDag + " " + KalenderFuncties.getMonth(intDag, intMaand, intJaar) 
        + " " + KalenderFuncties.getYear(intJaar) + " is een geldige datum");
  }
}

import java.util.*;

public class KalenderFuncties
{
    //////////////////////////////////////////
    // isDate
    //////////////////////////////////////////
    public static boolean isDate (int dag, int maand, int jaar)
    {
      GregorianCalendar kalender = new GregorianCalendar();
      kalender.setLenient(false);
      kalender.set(jaar, maand - 1, dag);
      boolean geldigeDatum = true;

      try { kalender.getTime(); }
      catch (IllegalArgumentException e) { geldigeDatum = false; }

      if (jaar < 1000) geldigeDatum = false; // Min. 4 cijfers

      return geldigeDatum;
    }

    public static boolean isDate (String datum)
    {
      int[] dateParts = new int[3];
      extractDateParts(datum, dateParts);
      return isDate(dateParts[0], dateParts[1], dateParts[2]);
    }

    //////////////////////////////////////////
    // getDay
    //////////////////////////////////////////
    public static String getDay (int dag, int maand, int jaar)
    {
      // For English use:
      // String dagen[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", 
        "Friday", "Saturday"};
      String dagen[] = {"Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", 
        "Vrijdag", "Zaterdag"};

      if (isDate(dag, maand, jaar))
      {
        GregorianCalendar kalender = new GregorianCalendar();
        kalender.set(jaar, maand - 1, dag);
        return dagen[kalender.get(kalender.DAY_OF_WEEK) - 1];
      }
      return "";
    }

    public static String getDay (String datum)
    {
        int[] dateParts = new int[3];
        extractDateParts(datum, dateParts);
        return getDay(dateParts[0], dateParts[1], dateParts[2]);
    }

    //////////////////////////////////////////
    // getMonth
    //////////////////////////////////////////
    public static String getMonth (int dag, int maand, int jaar)
    {
      // For English use:
      // String maanden[] = {"January", "February", "March", "April", "May", "June", "July",
      //                       "August", "September", "October", "November", "December"};
      String maanden[] = {"januari", "februari", "maart", "april", "mei", "juni", "juli",
                          "augustus", "september", "oktober", "november", "december"};

      if (isDate(dag, maand, jaar))
      {
        GregorianCalendar kalender = new GregorianCalendar();
        kalender.set(jaar, maand - 1, dag);
        return maanden[kalender.get(kalender.MONTH)];
      }
      return "";
    }

    public static String getMonth (String datum)
    {
        int[] dateParts = new int[3];
        extractDateParts(datum, dateParts);
        return getMonth(dateParts[0], dateParts[1], dateParts[2]);
    }

    //////////////////////////////////////////
    // getYear
    //////////////////////////////////////////
    public static int getYear (int jaar)
    {
      GregorianCalendar kalender = new GregorianCalendar();
      kalender.set(jaar, 0, 1);
      return kalender.get(kalender.YEAR);
    }

    public static int getYear (String datum)
    {
        int[] dateParts = new int[3];
        extractDateParts(datum, dateParts);
        return getYear(dateParts[2]);
    }

    //////////////////////////////////////////
    // Internal Kalender Utilities
    //////////////////////////////////////////
    private static void extractDateParts (String datum, int[] parts)
    {
      try
      {
        StringTokenizer st = new StringTokenizer(datum,"-/");
        parts[0] = Integer.parseInt(st.nextToken());
        parts[1] = Integer.parseInt(st.nextToken());
        parts[2] = Integer.parseInt(st.nextToken());
      }
      catch(Exception e) { }
    }
}


Ik zit alleen nog met één vraagje. Als ik bij jaar iets als '03' opgeef dan ziet 'ie dat als 1973 8)7 Maar ik wil dat dat dan gezien wordt als 2003 net als 'vroegah' je bijv. 1994 schreef als '94.
Of is de enige oplossing degene die ik al bedacht heb (jaar < 1000) ?

[ Voor 8% gewijzigd door Priet op 27-05-2003 23:14 . Reden: typo :p ]

"If you see a light at the end of a wormhole, it's probably a photon torpedo!"

Pagina: 1