2015-12-25 2 views
6

Если ввод 01-01-2015, он должен быть изменен на 2015-01-01.
Если ввод 2015-01-01, он должен быть изменен на 01-01-2015.
я использовал SimpleDateFormat, но не получить правильный вывод:Изменение формата даты

//Class to change date dd-MM-yyyy to yyyy-MM-dd and vice versa 
public class ChangeDate { 
    static SimpleDateFormat formatY = new SimpleDateFormat("yyyy-MM-dd"); 
    static SimpleDateFormat formatD = new SimpleDateFormat("dd-MM-yyyy"); 

    //This function change dd-MM-yyyy to yyyy-MM-dd 
    public static String changeDtoY(String date) { 
    try { 
     return formatY.format(formatD.parse(date)); 
    } 
    catch(Exception e) { 
     return null; 
    } 
    } 

    //This function change yyyy-MM-dd to dd-MM-yyyy 
    public static String changeYtoD(String date) { 
    try { 
     return formatD.format(formatY.parse(date)); 
    } 
    catch(Exception e) { 
     return null; 
    } 
    } 
} 

Я хочу некоторое условие, которое автоматически определяет паттерн Дейта и изменения в другой формат.

+0

Возможно, позиция первого дефиса? – Henry

+1

получить первый дефис в соответствии с тем, что выбор функции – Sreemat

ответ

2

Regex Является Overkill

Для даты и времени работы, нет необходимости возиться с regex.

Просто попробуйте разобрать один формат, захватив ожидаемое исключение. Если исключение действительно выбрано, попробуйте выполнить синтаксический разбор с другим форматом. Если выбрано исключение, то вы знаете, что ввод неожиданно отсутствует в любом формате.

java.time

Вы используете старые классы хлопотно даты и времени в настоящее время вытеснен java.time структуры, построенной на Java 8 и более поздних версий. Новые классы вдохновлены очень успешной картой, основанной на преемственности, которая была преемницей, похожей на концепцию, но перепроектированной. Определено JSR 310. Продлен проект ThreeTen-Extra. См. Oracle Tutorial.

LocalDate

Новые классы включают один, LocalDate, для даты и только значения без время- день. Только то, что вам нужно.

Форматтеры

Ваш первый формат может быть стандартный формат ISO 8601, YYYY-MM-DD. Этот формат используется по умолчанию в java.time.

Если эта первая попытка синтаксического анализа завершилась неудачно, потому что вход не соответствует формату ISO 8601, выбрасывается DateTimeParseException.

LocalDate localDate = null; 
try { 
    localDate = LocalDate.parse(input); // ISO 8601 formatter used implicitly. 
} catch (DateTimeParseException e) { 
    // Exception means the input is not in ISO 8601 format. 
} 

Другой формат должен быть указан закодированным шаблоном, аналогичным тому, что вы делаете с SimpleDateFormat. Поэтому, если мы поймаем исключение с первой попытки, сделайте вторую попытку анализа.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate localDate = null; 
try { 
    localDate = LocalDate.parse(input); 
} catch (DateTimeParseException e) { 
    // Exception means the input is not in ISO 8601 format. 
    // Try the other expected format. 
    try { 
     localDate = LocalDate.parse(input , formatter); 
    } catch (DateTimeParseException e) { 
     // FIXME: Unexpected input fit neither of our expected patterns. 
    } 
} 
+1

Использование исключений для обработки не исключительного поведения (/ для управления потоком) - очень плохая практика. -1. – XenoRo

+1

Обработка исключений здесь требуется, поскольку основной Java-метод называется объявлением исключения. Если try/catch опущен, код не будет успешно скомпилирован. В этом примере улавливается конкретное исключение DateTimeParseException, созданное методом parse вместо простого Exception или Throwable, поэтому этот пример показывает краткий и правильный код. –

+0

@JasonPlurad Hm, 'DateTimeParseException' является' RuntimeException', поэтому компилятор не требует явной обработки исключений (бросает или улавливает). Или вы говорите о чем-то еще? В любом случае, 'LocalDate.parse (...)' будет компилироваться без кода try/catch. Если это решение является элегантным, это другой вопрос. –

0

Читайте о Pattern, Matcher и регулярных выражений.

Java-код (на основе ОП):

if (date.matches("\\d{2}-\\d{2}-\\d{4}")){ 
    //convert D format to Y format... 
} else if(date.matches("\\d{4}-\\d{2}-\\d{2}")){ 
    //convert Y to D... 
} else { 
    throw new IllegalArgumentException("Received date format is not recognized."); 
} 

Примечание: Этот матч-шаблон может быть улучшена с capture groups.
Ex: "\\d{4}(-\\d{2}){2}" или "(-?\\d{2}){2}\\d{4}"

+2

Downvoter можно сообщить о его причинах ... – XenoRo

7

Есть 2 варианта:

  1. Попробуйте проверить с регулярным выражением STH. как:

    if (dateString.matches("\\d{4}-\\d{2}-\\d{2}")) { 
        ... 
    } 
    
  2. Попытка преобразовать в первый шаблон, если он бросает исключение, попробуйте преобразовать в другой шаблон (но это плохая практика, чтобы сделать это)

+0

Я попробую первый вариант, я попробовал второй вариант, но он конвертировал и дал недопустимую дату. Спасибо – Sreemat

+0

Использование исключений должны быть ограничены фактическими исключениями, а не обработкой предполагаемого поведения. -1. – XenoRo

+0

Не выбрасывает исключение @AlmightyR – Sreemat

-2

Просто сравните положение первый символ '-' в строке даты.

+1

Предполагает, что читатель знает или понимает «как», и в этот момент они, вероятно, не просят/не читают этот ответ. -1. – XenoRo

+0

Ваше приветствие и благодарность AlmightyR –

+0

@SantoshVishwakarma Как и сейчас, этот ответ должен был быть размещен как комментарий. Пожалуйста, добавьте еще несколько пояснений и пример кода, чтобы стать полноценным ответом. –

0

См: https://docs.oracle.com/javase/tutorial/displayCode.html?code=https://docs.oracle.com/javase/tutorial/datetime/iso/examples/StringConverter.java

Non-ISO Дата преобразования https://docs.oracle.com/javase/tutorial/datetime/iso/nonIso.html

Добавление новой хронологии, которая определяет даты ISO либо способом является другим совместимым (небьющимся) означает, что для ввода в данных Дата и магазин он в правильных структурах (где другие функции могут легко работать с данными). См.: https://docs.oracle.com/javase/8/docs/api/java/time/chrono/Chronology.html

«Регулярный метод» может быть нарушен ошибочным вводом и не оставляет никаких средств для возврата стандартной ошибки в ответ на все, что было введено (чтобы получить стандартный идентичный результат везде).

См. Ответ, предоставленный пользователем «Tardate» в этой теме: How to sanity check a date in java.

Вы хотите пуленепробиваемый ввод и хранить его в правильно идентифицированных структурах, чтобы легко манипулировать им другими функциями.

Смежные вопросы