PHP la fonction strtotime() en Java

Strtotime () en PHP peut effectuer les transformations suivantes:

Entrées:

strtotime(’2004-02-12T15:19:21+00:00′);
strtotime(’Thu, 21 Dec 2000 16:01:07 +0200′);
strtotime(’Monday, January 1st’);
strtotime(’tomorrow’);
strtotime(’-1 week 2 days 4 hours 2 seconds’);

Sorties:

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

Est-il un moyen facile de le faire en java?

Oui, c'est un double. Cependant, la question initiale n'a pas reçu de réponse. J'ai généralement besoin de la possibilité d'interroger des dates du passé. Je veux donner à l'utilisateur la possibilité de dire " je veux que tous les événements de "-1 semaine" à "maintenant". Cela rendra les scripts de ces types de requêtes beaucoup plus faciles.

25
demandé sur Community 2009-08-12 23:19:31

5 réponses

J'ai essayé d'implémenter une classe simple (statique) qui émule certains des modèles de PHP strtotime. Cette classe est conçue pour être ouverte pour modification (ajoutez simplement un nouveau Matcher via 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();
    }
}

Utilisation

Utilisation de Base:

 Date now = strtotime("now");
 Date tomorrow = strtotime("tomorrow");
Wed Aug 12 22:18:57 CEST 2009
Thu Aug 13 22:18:57 CEST 2009

Extension

Pour l'exemple, nous allons ajouter jours 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;
    }
});

Alors vous pouvez écrire:

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

(maintenant est Wed Aug 12 22:18:57 CEST 2009)

Sat Aug 15 22:18:57 CEST 2009
Sun Aug 09 22:18:57 CEST 2009
31
répondu dfa 2012-07-03 18:48:52

Vous pouvez utiliser un format de Date Simple pour une telle chose, mais vous devez connaître le format de date avant d'analyser la chaîne. PHP va essayer de le deviner, Java s'attend à ce que vous lui disiez explicitement quoi faire.

Exemple :

SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat formater = new SimpleDateFormat("MM/dd/yy");
Date d = parser.parse("2007-04-23 11:22:02");
System.out.println(formater.format(d));

Il produit:

04/23/2007

SimpleDateFormat échouera silencieusement si la chaîne n'est pas dans le format approprié, sauf si vous définissez:

parser.setLenient(false);

Dans ce cas, il lancera java.texte.ParseException.

Pour le formatage anticipé, utilisez le DateFormat et c'est de nombreux opérateurs .

4
répondu e-satis 2012-07-17 20:09:41

Regardez JodaTime , je pense que c'est la meilleure bibliothèque datetime pour java.

3
répondu MarrLiss 2013-11-08 14:37:38

Utilisez un calendrier et formatez le résultat avec SimpleDateFormat:

Http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html

    Calendar now = Calendar.getInstance();
    Calendar working;
    SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");

    working = (Calendar) now.clone();

    //strtotime("-2 years")
    working.add(Calendar.DAY_OF_YEAR, - (365 * 2));
    System.out.println("  Two years ago it was: " + formatter.format(working.getTime()));

    working = (Calendar) now.clone();

    //strtotime("+5 days");
    working.add(Calendar.DAY_OF_YEAR, + 5);
    System.out.println("  In five days it will be: " + formatter.format(working.getTime()));

Bien, c'est beaucoup plus verbeux que strtotime () de PHP, mais à la fin de la journée, c'est la fonctionnalité que vous recherchez.

2
répondu karim79 2009-08-12 20:07:44

Pour autant que je sache, rien de tel n'existe. Vous devriez en pirater un ensemble vous-même. Cependant, cela pourrait ne pas être nécessaire. Essayez de stocker les dates comme horodatages et juste faire le calcul simple. Je comprends que ce n'est pas aussi propre que vous le souhaitez. Mais il pourrait fonctionner.

1
répondu seventeen 2009-08-12 19:28:46