Форсирование 4-х значного года в простом формате java

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

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

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

5 ответов

Решение

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

Хм. Я подозреваю, что вы должны использовать "MM" вместо "mm", чтобы начать с... но "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

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

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

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

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

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

Шаг 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

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

Другие вопросы по тегам