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.
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
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 .
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.
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.