форсировать 4-х значный год в простом формате java - PullRequest
15 голосов
/ 24 июня 2010

Я хочу проверять и анализировать даты, используя 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 ]

4 голосов
/ 24 июня 2010

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

2 голосов
/ 24 июня 2010

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

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

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

2 голосов
/ 24 июня 2010

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

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

1 голос
/ 16 сентября 2011

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

Шаг 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
1 голос
/ 24 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...