Подтвердить что ты не робот

Форсирование 4-х цифр в java simpledateformat

Я хочу проверить и проанализировать даты с помощью simpleDateFormat с форматом "yyyymmdd" Это также позволяет 100624, который анализируется до 10 года (спустя 54 года после смерти Юлиуса Цезара). Даты также будут похожи на 1970 год, поэтому я не хочу соглашаться с SimpleDateFornat ( "yymmdd" ).

Мне интересно, есть ли способ форсировать четырехзначный формат года с помощью SimpleDateFormat? Я близок к тому, чтобы выполнить предварительный тест regexp, но, возможно, есть умный способ использования (Simple) DateFormat()?

В соответствии с запросом кода все становится все сложнее, и мои исследования были наполовину. Для начала использовался формат yyyy-MM-dd (он исходил из переменной, у которой был неправильный javadoc). Однако, как указано в ответе ниже yyyyMMdd, он набирает четырехлетнюю цифру. Поэтому мой вопрос изменился на "Как заставить четырехзначный год для формата" yyyy-MM-dd ". И почему" yyyyMMdd" ведет себя по-другому?

    public void testMaturity() {
    try {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        sdf.setLenient(false);
        System.out.println(" " + sdf.format(sdf.parse("40-12-14")));
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMdd");
        sdf.setLenient(false);
        System.out.println(" " + sdf2.format(sdf2.parse("401214")));
        fail();
    } catch (ParseException pe) {
        assertTrue(true);
    }

Какие печатает 0040-12-14

4b9b3361

Ответ 1

Просто используйте yyyyMMdd (обратите внимание: верхний регистр М используется для указания месяца, иначе вы разбираете минуты!), а затем проверьте, если год больше некоторой даты отсечения (например, при разборе дат рождения, более 1800 - это безопасная ставка, когда синтаксический анализ дат для более высоких дат, превышающих или равных текущему году, был бы хорош).

Ответ 2

Хм. Я подозреваю, что вы должны использовать "ММ" вместо "мм", чтобы начать с... но "100624" в любом случае не анализируется, когда я его пытаюсь - даже в мягком режиме:

import java.util.*;
import java.text.*;

public class Test
{
    public static void main(String[] args) throws Exception
    {
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");
        format.setLenient(true);
        tryParse(format, "100624");
        format.setLenient(false);
        tryParse(format, "100624");
    }

    static void tryParse(DateFormat format, String text)
    {
        try
        {
            Date date = format.parse(text);
            System.out.println("Parsed " + text + " to " + date);
        }
        catch (ParseException pe)
        {
            System.out.println("Failed to parse " + text);
        }
    }
}

(И даже используя "мм" вместо "ММ", он все равно не разбирается.)

Печать

Failed to parse 100624
Failed to parse 100624

Возможно, вы могли бы показать код, который управляет этим анализом?

Ответ 3

Попробуйте вызвать setLenient(false); в объекте SimpleDateFormat, который заставит его использовать более строгие правила для синтаксического анализа (в противном случае он попытается быть "умным", если входная строка не соответствует формату). Например:

DateFormat df = new SimpleDateFormat("yyyyMMdd");
df.setLenient(false);

И, конечно, месяцы MM, а не MM.

Ответ 4

Для этого нет простого способа. Если вы говорите, что даты могут быть похожи на 1970 год, основным вопросом будет то, что означает 700624 - 1970 или 2070? Вы должны либо выполнить некоторую дату отсечения, как предлагаемый Йоахим, либо полностью перейти на 4-х значный год.

Ответ 5

Ну, это совершенно прямо и вперед. Выполните следующие простые шаги:

Шаг 1:

try {
    String dates = "40-12-14";
    String patterns = "yy-MM-dd";
    SimpleDateFormat format3 = new SimpleDateFormat(patterns);``
    java.util.Date dates1 = format3.parse(dates);

    SimpleDateFormat sdfDates = new SimpleDateFormat("dd/MM/yyyy");

    String strDate1 = sdfDate.format(dates1);
    System.out.println("Date1: " + strDate1);

}
catch(ParseException e){
    e.printStackTrace();
}

Это выведет:

Date1: 14/12/1940