PHP strtotime () в Java

strtotime () в PHP может выполнять следующие преобразования:

Входы:

 StrToTime ( '2004-02-12T15: 19: 21 + 00: 00');
 strtotime ('Thu, 21 Dec 2000 16:01:07 +0200');
 strtotime («Понедельник, 1 января»);
 StrToTime ( 'завтра');
 strtotime ('- 1 неделя 2 дня 4 часа 2 секунды');

Выходы:

 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

Есть ли простой способ сделать это в java?

Да, это дубликат . Однако на исходный вопрос не ответил. Мне обычно нужна возможность запрашивать даты из прошлого. Я хочу дать пользователю возможность сказать «Я хочу, чтобы все события с« -1 неделя »до« теперь ». Это упростит эти запросы.

Я попытался реализовать простой (статический) класс, который эмулирует некоторые шаблоны strtotime PHP. Этот класс предназначен для открытия для изменения (просто добавьте новый Matcher через 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(); } } 

Применение

Основное использование:

  Date now = strtotime("now"); Date tomorrow = strtotime("tomorrow"); 
 Ср Авг 12 22:18:57 CEST 2009
 Чт 13 авг 22:18:57 CEST 2009

простирающийся

Например, добавим разделитель дней :

 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; } }); 

то вы можете написать:

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

(сейчас Wed Aug 12 22:18:57 CEST 2009 )

 Сб Авг 15 22:18:57 CEST 2009
 Вс авг. 09 22:18:57 CEST 2009

Вы можете использовать формат Simple Date для такой вещи, но перед разбором строки вы должны знать формат даты. PHP попытается угадать, Java ожидает, что вы сообщите ему явно, что делать.

Пример :

 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)); 

Он выводит:

 04/23/2007 

SimpleDateFormat терпит неудачу, если строка не в правильном формате, если вы не установили:

 parser.setLenient(false); 

В этом случае он выкинет java.text.ParseException.

Для форматирования используйте DateFormat и его многочисленные операторы .

Посмотрите на JodaTime , я думаю, что это лучшая библиотека datetime для java.

Используйте Календарь и отформатируйте результат с помощью 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())); 

Хорошо, это значительно более многословно, чем PHP strtotime (), но в конце концов это функциональность, которой вы пользуетесь.

Насколько я знаю, ничего подобного не существует. Вам придется взломать себя. Однако это может и не понадобиться. Попробуйте сохранить даты как временные метки и просто выполнить простую математику. Я понимаю, что это не так чисто, как вам может понравиться. Но это сработает.