Как разобрать неоднозначную строку в дату? - PullRequest
4 голосов
/ 11 июля 2011

Я пытаюсь найти "простой" способ синтаксического анализа строки в объекте Date.

Строка может быть yyyyMMdd, yyyyMMddHHmm или yyyyMMddHHmmSS.

В настоящее время я смотрю на длину строки и создаю DateParser в зависимости от длины. Есть ли более элегантный способ сделать это?

Ответы [ 5 ]

6 голосов
/ 11 июля 2011

Или вы можете дополнить вашу строку нулями:

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmSS") {
  @Override
  public Date parse(String s) throws ParseException {
    return super.parse((s + "000000").substring(0, 14));
  }
};

System.out.println(sdf.format(sdf.parse("20110711182405")));
System.out.println(sdf.format(sdf.parse("201107111824")));
System.out.println(sdf.format(sdf.parse("20110711")));
4 голосов
/ 11 июля 2011

Я бы сделал, как вы, посмотрев на длину строки и создав соответствующий SimpleDateFormat экземпляр.

SimpleDateFormat getFormatFor( String dateString ){
    if ( dateString.length() == 8  ) return new SimpleDateFormat("yyyyMMdd");
    if ( dateString.length() == 14 ) return new SimpleDateFormat("yyyyMMddHHmmss");
    // you got a bad input...
}

Обратите внимание, что они не ориентированы на многопотоковое исполнение, поэтому вам следует каждый раз создавать новый.

2 голосов
/ 11 июля 2011

Я бы использовал класс SimpleDateFormat и заполнил шаблон формата на основе длины строки. Это будет хорошо работать, если у вас в один прекрасный день нет строк одинаковой длины.

Используя примеры из вашего вопроса:

Форматирование 11 июля 2011 г .:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date parsedDate = dateFormat.parse("20110711");

Форматирование 11 июля 2011 г., 13:00:

dateFormat = new SimpleDateFormat("yyyyMMddHHmm");
parsedDate = dateFormat.parse("201107111340");

Форматирование 11 июля 2011 г. 1340 ч. 10 с .:
(примечание: маленькое s для секунд, заглавная S для миллисекунд!)

dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
parsedDate = dateFormat.parse("20110711134010");

См. Гиперссылку для получения полного списка букв шаблонов формата.

0 голосов
/ 11 июля 2011

Вы все еще можете использовать «специализированные» парсеры (как вы предлагали) и объединять их в цепочку: например, у вас все еще могут быть DateHourMinSecParser (для yyyyMMddHHmmSS), DateHourMinParser (для yyyyMMddHHmm) иDateParser (для yyyyMMdd) все они реализуют один и тот же интерфейс:

public interface GenericDateParser {
 Date parseDate(String input) throws IllegalArgumentException;
}

например,

public class DateHourMinSecParser implements GenericDateParser {
...
     public Date parseDate(String input) throws IllegalArgumentException {
     ...
     }
}

, но каждый из этих классов будет фактически принимать параметр другого GenericDateParser -- идея заключается в том, что каждый синтаксический анализатор сначала попытается проанализировать саму дату, если при синтаксическом анализе (или некоторых внутренних проверках - например, длине строки) он не удастся передать его следующему синтаксическому анализатору в цепочке, пока парсеры не исчезнутцепочка (в этом случае она выдаст исключение, или один из членов цепочки вернет значение):

public class DateHourMinSecParser implements GenericDateParser {
     private GenericDateParser chained;

     public DateHourMinSecParser(GenericDateParser chained) {
       this.chained = chained;
     }

     public Date parseDate(String input) throws IllegalArgumentException {
      if( !internalChecks() ) { //chain it up
       if( chained == null ) throw new IllegalArgumentException( "Don't know how to parse " + input);
      }
      //internal checks passed so try to parse it and return a Date or throw exception
      ...
     }
}

, и вы инициализируете их:

GenericDateParser p = new DateHourMinSecParser( new DateHourMinParser(new DateParser(null)) );

а затем просто используйте верхний уровень один:

Date d = p.parse( '20110126' );
0 голосов
/ 11 июля 2011

Вы можете использовать DateFormatter для анализа даты из строки.

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

public class StringToDate
{
 public static void main(String[] args) 
 {
 try 
 {  
   String str_date="11-June-07";
   DateFormat formatter ; 
   Date date ; 
   formatter = new SimpleDateFormat("yyyy-MM-dd");
   date = (Date)formatter.parse(str_date);  

  } 
  catch (ParseException e)
  {
    System.out.println("Exception :"+e);  
  }  
 }
} 

Вы можете изменить шаблон так, как вам нравится, чтобы отражать ваши потребности.

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