Форсирование 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
Ответы
Ответ 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