Avatar billede eiland Nybegynder
30. maj 2002 - 08:49 Der er 15 kommentarer og
1 løsning

Finde dato fra en String

Hej
Jeg arbejder på en hjemmeside, og her skal brugeren angive en dato, så jeg ved ikke hvilken række følge dag, måned og år bliver skrevet i, men jeg kan forstille mig som nedenstående. Det jeg leder efter er en funktion, der kan finde ud af hvordan den er skrevet og returnerer datoen i et fast format.
d/m
d/mm
dd/mm
dd/mm-åååå
d/m-åååå
dd/m-åååå
d/mm-åååå
åååå-mm-dd
åååå-dd/mm
åå-dd/mm
dd-mm-åå
d-mm-åå
d-m-åå
ddmmåå
ddmmåååå
dd mmåååå
ddmm åååå
Avatar billede erikjacobsen Ekspert
30. maj 2002 - 08:53 #1
Hvis du giver brugeren så mange valgmuligheder, har du ikke mange chancer for at gætte
den rigtige dato, så enten

  1) Fortæl brugeren at han skal skrive i et bestemt format fx DD-MM/YYYY og check det
  2) Lav 3 dropdown boxe (til dag, måned, år)
  3) Find en smart "datpicker" i JavaScript, som viser fx en måned af gangen med
      mulighed for at bladre.
Avatar billede erikjacobsen Ekspert
30. maj 2002 - 08:53 #2
Ups -- glem det med JavaScript - jeg tænkte på JSP .... :)
Avatar billede Slettet bruger
30. maj 2002 - 08:55 #3
Der findes en funktion som hedder SimpleDateFormatter, læs mere om den. Den kan opfylde dine behov
Avatar billede eiland Nybegynder
30. maj 2002 - 08:55 #4
Alternativet er at jeg selv skal sidde og kode det.
Avatar billede bearhugx Nybegynder
30. maj 2002 - 08:56 #5
Du kan bruge SimpleDateFormat til at parse

F.eks.
---------------------------------------
Dato d;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try{
  d = sdf.parse("2002-05-30");
} catch ( ParseException pEx )
{}
---------------------------------------
Avatar billede Slettet bruger
30. maj 2002 - 08:56 #6
Hvis det kniber så sig til, så skal jeg lave et lille eks. til dig
Avatar billede bearhugx Nybegynder
30. maj 2002 - 08:57 #7
Unskyld... Det er selvfølgelig
'Date' og ikke 'Dato'
Avatar billede bearhugx Nybegynder
30. maj 2002 - 09:00 #8
Her er min egen DatoParseBean ... som er konfigurerbar :-)

package com.skroeder.beans.util;

import java.text.*;
import java.util.*;

public class DateParser
{
    private static Vector patterns = new Vector(5,5);
   
    public static void addPattern(String pattern)
    { patterns.add(pattern);
    }
   
    public static Date parseDate(String dateString)
    {
        Date date = null;
   
        Iterator patternIter = patterns.iterator();
        while (patternIter.hasNext())
        {
            String pattern = (String)patternIter.next();
            SimpleDateFormat sdf = new SimpleDateFormat(pattern);
            try
            {    date = sdf.parse( dateString );
                if (date!=null)
                {    return date;
                }
            } catch (ParseException pEx)
            {}       
        }
        return date;
    }
   
    public static void initializePatterns()
    {    patterns.clear();   
        DateParser.addPattern("dd.MM.yy");
        DateParser.addPattern("dd/MM-yy");
        DateParser.addPattern("dd MM yy");
        DateParser.addPattern("ddMMyy");

        DateParser.addPattern("dd.MM.yyyy");
        DateParser.addPattern("dd/MM-yyyy");
        DateParser.addPattern("dd MM yyyy");
        DateParser.addPattern("ddMMyyyy");
    }
}
Avatar billede disky Nybegynder
30. maj 2002 - 09:27 #9
bearhugx:

Din metode virker, men er lidt af et misbrug af 'Exceptions'

En exception er beregner til at fange en undtagelse, ikke bruge som en del af et program.
Performance på brugen af exceptions er rimelig dårlig, da de tager en del tid at udføre.

Jeg ved godt jeg selv er kommet med det foreslag at man kan gøre det på den måde, man skal bare vide hvad konsekvenser det har for hastigheden.
Specielt hvis du har 20 forskellige mulige patterns.

Den klart bedste løsning er, at du laver en intelligent parsning af datoerne istedet.
Avatar billede disky Nybegynder
30. maj 2002 - 09:27 #10
eiland:
Hov det sidste var til dig.

Lav en intelligent parsning af datoerne istedet, det er en bedre løsning.
Avatar billede bearhugx Nybegynder
30. maj 2002 - 09:32 #11
Disky >>Den dag, der findes en SimpleDateFormat.parse(), som ikke kaster ex, så er jeg mere end villig til at revidere koden... try-catch-blokken er kun med som et nødvendigt onde...
Avatar billede erikjacobsen Ekspert
30. maj 2002 - 09:35 #12
Der findes regulære udtryk, bearhugx. Det vil være meget simplere at bruge
i dit tilfælde (En exception oprettet og initialiser et objekt, der
senere skal garbage-collectes. Det er lidt meget for så lidt)
Avatar billede bearhugx Nybegynder
30. maj 2002 - 09:38 #13
Oh.... Regexes er virkelig noget, skal have læst på... Der er efterhånden ved at være mange som foreslår det i forbindelse med løsninger...

Er der nogen, der kender en god regex-tutorial
Avatar billede eiland Nybegynder
30. maj 2002 - 11:06 #14
bearhugx Tak for koden, jeg valgte at bruge den, da den passer fint til mit formål.
Avatar billede disky Nybegynder
30. maj 2002 - 11:14 #15
bearhugx:
Det du gør med exceptions er misbrug af Java.

Selvfølgelig skal den kaste en exception, fordi du forsøger at oversætte noget ulovligt.
Lav en intelligent routine istedet, det er faktisk ret nemt.


Erik:
Regexp er ikke særligt anvendelig til datoer.
Avatar billede erikjacobsen Ekspert
30. maj 2002 - 11:29 #16
Et eksempel med regulære udtryk, som så kan gøres mere eller mindre intelligent.

//    String dato = "02 03/1";
//    String dato = "2/3/2001";
    String dato = "02-03-01";

    Pattern dateExp = Pattern.compile("^(\\d+)[ /-](\\d+)[ /-](\\d+)$");
    Matcher m = dateExp.matcher(dato);
    if (m.matches()) {
      int dd=Integer.parseInt(m.group(1));
      int mm=Integer.parseInt(m.group(2));
      int yy=Integer.parseInt(m.group(3));
      if (yy<100) yy+=2000;
      System.out.println(dd+"-"+mm+"/"+yy);
    } else {
      System.out.println("Cornflakes");
    }
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester