strtotime PHP () в Java

Существует две причины использования псевдонимов таблицы.

первое является косметическим. Операторы легче записать, и возможно также легче читать, когда псевдонимы таблицы используются.

второе более независимо. Если таблица появляется несколько раз в ИЗ пункта, Вам нужны псевдонимы таблицы для хранения их отличными. Сам соединения распространены в случаях, где таблица содержит внешний ключ, который ссылается на первичный ключ той же таблицы.

Два примера: список сотрудников, который содержит supervisorID столбец, который ссылается на employeeID супервизора.

вторым является взрыв частей. Часто, это реализовано в отдельной таблице с тремя столбцами: ComponentPartID, AssemblyPartID и Количество. В этом случае не будет никого сам соединения, но часто будет три пути соединение между этой таблицей и двумя различными ссылками на таблицу Частей.

Это - хорошая привычка войти.

25
задан Community 23 May 2017 в 11:53
поделиться

5 ответов

Я попытался реализовать простой (статический) класс, который имитирует некоторые шаблоны PHP strtotime . Этот класс разработан, чтобы быть открытым для модификации (просто добавьте новый 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");
Wed Aug 12 22:18:57 CEST 2009
Thu Aug 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"));

(теперь среда, 12 августа, 22:18:57 CEST 2009 )

Sat Aug 15 22:18:57 CEST 2009
Sun Aug 09 22:18:57 CEST 2009
32
ответ дан 28 November 2019 в 21:11
поделиться

Вы можете использовать для этого простой формат даты, но вы должны знать формат даты перед синтаксическим анализом строки. 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 и его многочисленные операторы .

4
ответ дан 28 November 2019 в 21:11
поделиться

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

3
ответ дан 28 November 2019 в 21:11
поделиться

Используйте календарь и отформатируйте результат с помощью 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 (), но, в конце концов, это функциональность, которая вам нужна.

2
ответ дан 28 November 2019 в 21:11
поделиться

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

1
ответ дан 28 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: