Форсирование 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? Вы должны либо ввести некоторую дату отсечения, как предложил Иоахим, либо полностью перейти на четырехзначный год.