4 Stimmen

PHPs strtotime() in Java?

Ich bin auf der Suche nach einer einfachen Möglichkeit, eine MySQL DATETIME von jeder Art von Zeit-Eingabe ein Benutzer eingeben kann generieren. PHP macht es einfach mit seiner strtotime() Funktion, die das kann:

strtotime(’2004-02-12T15:19:21+00:00);

strtotime('Thu, 21 Dec 2000 16:01:07 +0200);

strtotime('Montag, 1. Januar');

strtotime('morgen');

strtotime('-1 Woche 2 Tage 4 Stunden 2 Sekunden');

Ausgänge:

2004-02-12 07:02:21

2000-12-21 06:12:07

2009-01-01 12:01:00

2009-02-12 12:02:00

2009-02-06 09:02:41

Ich will das in Java!

0voto

Yuseferi Punkte 6592

Ich habe versucht, eine einfache (statische) Klasse zu implementieren, die einige der Muster von PHPs strtotime . Dieser Kurs ist so konzipiert, dass er offen für Änderungen (fügen Sie einfach eine neue Matcher über registerMatcher ) :

public final class strtotime {

    private static final List<Matcher> matchers;

    static {
        matchers = new LinkedList<Matcher>();
        matchers.add(new NowMatcher());
        matchers.add(new TomorrowMatcher());
        matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy.MM.dd G 'at' HH:mm:ss z")));
        matchers.add(new DateFormatMatcher(new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z")));
        matchers.add(new DateFormatMatcher(new SimpleDateFormat("yyyy MM dd")));
        // add as many format as you want 
    }

    // not thread-safe
    public static void registerMatcher(Matcher matcher) {
        matchers.add(matcher);
    }

    public static interface Matcher {

        public Date tryConvert(String input);
    }

    private static class DateFormatMatcher implements Matcher {

        private final DateFormat dateFormat;

        public DateFormatMatcher(DateFormat dateFormat) {
            this.dateFormat = dateFormat;
        }

        public Date tryConvert(String input) {
            try {
                return dateFormat.parse(input);
            } catch (ParseException ex) {
                return null;
            }
        }
    }

    private static class NowMatcher implements Matcher {

        private final Pattern now = Pattern.compile("now");

        public Date tryConvert(String input) {
            if (now.matcher(input).matches()) {
                return new Date();
            } else {
                return null;
            }
        }
    }

    private static class TomorrowMatcher implements Matcher {

        private final Pattern tomorrow = Pattern.compile("tomorrow");

        public Date tryConvert(String input) {
            if (tomorrow.matcher(input).matches()) {
                Calendar calendar = Calendar.getInstance();
                calendar.add(Calendar.DAY_OF_YEAR, +1);
                return calendar.getTime();
            } else {
                return null;
            }
        }
    }

    public static Date strtotime(String input) {
        for (Matcher matcher : matchers) {
            Date date = matcher.tryConvert(input);

            if (date != null) {
                return date;
            }
        }

        return null;
    }

    private strtotime() {
        throw new UnsupportedOperationException();
    }
}

Verwendung

Grundlegende Verwendung:

 Date now = strtotime("now");
 Date tomorrow = strtotime("tomorrow");

Wed Aug 12 22:18:57 CEST 2009
Thu Aug 13 22:18:57 CEST 2009

Erweitern Sie

Fügen wir zum Beispiel Folgendes hinzu Tage-Matcher :

strtotime.registerMatcher(new Matcher() {

    private final Pattern days = Pattern.compile("[\\-\\+]?\\d+ days");

    public Date tryConvert(String input) {

        if (days.matcher(input).matches()) {
            int d = Integer.parseInt(input.split(" ")[0]);
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DAY_OF_YEAR, d);
            return calendar.getTime();
        }

        return null;
    }
});

dann können Sie schreiben:

System.out.println(strtotime("3 days"));
System.out.println(strtotime("-3 days"));

(jetzt ist Wed Aug 12 22:18:57 CEST 2009 )

Sat Aug 15 22:18:57 CEST 2009
Sun Aug 09 22:18:57 CEST 2009

-3voto

Kirk Ouimet Punkte 25374

Danke für die schnelle Antwort ChssPly76. Hier ist meine Lösung, auch wenn sie hart kodiert ist, um Daten in diesem Format zu verarbeiten: "5 Aug 2009 07:27:51 GMT". Vielleicht gibt es einen Weg, um es zu ermöglichen, einfach mit anderen Formaten im Falle einer Parse-Ausnahme umgehen?

public static String stringToDateTime(String string) {
    SimpleDateFormat sdf = new SimpleDateFormat("d MMM yyyy HH:mm:ss z");
    Date date;
    String sqlDate;
    try {
        date = sdf.parse(string);
        SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        sqlDate = sqlFormat.format(date);
    }
    catch(ParseException ex) {
        sqlDate = string;
    }

    return sqlDate;
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X