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

StackOverflow https://stackoverflow.com/questions/1443430

Вопрос

Какой самый лучший способ проанализировать дату, которая может быть в одном из следующих форматов

 "dd-MM-yyyy HH:mm"
 "dd/MM/yyyy HH:mm"
 "dd.MM.yyyy HH:mm"

без создания 3 SimpleDateFormats и анализа каждого из них.

Спасибо

Это было полезно?

Решение

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

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

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

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

Другие советы

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

Вы можете использовать Общий язык Apache 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, но что в этом плохого?

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

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

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

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» будет разрешено.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top