Формат даты Java, который позволяет - / или. как разделители в рамках даты

Самый легкий ответ мог бы быть: "сдайтесь и используйте jQuery". Если это приемлемо, это, вероятно, легче, чем борьба с шаблонами Django по чему-то настолько простому.

5
задан Rich Seller 18 September 2009 в 09:34
поделиться

6 ответов

Вероятно, проще всего «настроить» исходную строку в канонический формат:

if (text.length() == 16)
{
    if ((text.charAt(2) == '/' && text.charAt(5) == '/') ||
        (text.charAt(2) == '.' && text.charAt(5) == '.'))
    {
        text = text.substring(0, 2) + "-" + text.substring(3, 5) 
           + "-" + text.substring(6);
    }
}

Затем используйте строку формата с помощью «-».

Обратите внимание, что это очень специфично, только замена точно персонажей, которые вам интересны, чтобы избежать нежелательных побочных эффектов.

5
ответ дан 13 December 2019 в 05:38
поделиться

Не могли бы вы сначала выполнить две операции замены, чтобы сократить все три формата до одного?

5
ответ дан 13 December 2019 в 05:38
поделиться

Вы можете использовать Apache commons lang DateUtils.parseDate

import java.text.ParseException;
import org.apache.commons.lang.time.DateUtils;

public class Test {

public static void main(String[] args) throws ParseException {

    String[] values = new String[]{"31-12-2009 12:00", "31/12/2009 12:00", "31.12.2009 12:00"};
    String[] parsePatterns = new String[]{"dd-MM-yyyy HH:mm", "dd/MM/yyyy HH:mm", "dd.MM.yyyy HH:mm"};

    for (String value : values) {
        System.out.println(DateUtils.parseDate(value, parsePatterns));
    }
}
}

Ну, внутри он создает SimpleDateFormats, но что в этом плохого?

4
ответ дан 13 December 2019 в 05:38
поделиться

как насчет регулярного выражения:

"\\d\\d[./-]\\d\\d[./-]\\d\\d\\d\\d \\d\\d:\\d\\d"

В коде это будет означать что-то вроде этого:

Pattern pattern = 
Pattern.compile("(\\d\\d)([./-])(\\d\\d)([./-])(\\d\\d\\d\\d) (\\d\\d):(\\d\\d)");

Matcher matcher = 
pattern.matcher("31-07-1983 15:30");

if (matcher.find() && matcher.group(2).equals(matcher.group(4))) {
  int day = Integer.parseInt(matcher.group(1));
  int month = Integer.parseInt(matcher.group(3));
  int year = Integer.parseInt(matcher.group(5));
  int hour = Integer.parseInt(matcher.group(6));
  int minute = Integer.parseInt(matcher.group(7));
} 
1
ответ дан 13 December 2019 в 05:38
поделиться

ParseExact может принимать массив форматов. Вам все равно нужно указать все форматы, но это одна операция.

-3
ответ дан 13 December 2019 в 05:38
поделиться

Сделать это самостоятельно с помощью регулярного выражения:

public class SpecialDateFormat
{
    private final static Pattern PATTERN = Pattern.compile("(\\d{2})[\\.\\/\\-](\\d{2})[\\.\\/\\-](\\d{4}) (\\d{2}):(\\d{2})");

    public static Date parse(String text) throws ParseException {
        Matcher m = PATTERN.matcher(text);
        if (m.matches()) {
            int dd = Integer.parseInt(m.group(1));
            int mm = Integer.parseInt(m.group(2));
            int yy = Integer.parseInt(m.group(3));
            int hh = Integer.parseInt(m.group(4));
            int mi = Integer.parseInt(m.group(5));

            // NOTE: Checking if values are in valid ranges omitted

            Calendar cal = Calendar.getInstance();
            cal.set(yy, mm - 1, dd, hh, mi, 0);

            return cal.getTime();
        }
        else {
            throw new ParseException("Unparseable date: " + text, 0);
        }
    }
}

Обратите внимание, однако, что это позволяет смешивать разные разделители, например, «17-09 / 2009 12:00» будет разрешено.

0
ответ дан 13 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

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