Общий способ разбора дат в Java - PullRequest
5 голосов
/ 05 августа 2011

Каков наилучший способ разбора дат в Java? Существуют ли какие-либо встроенные средства для анализа строк, такие как «18 июля 2011», «18 июля 2011», «18-07-2011», «2011-07-18», не зная заранее формат?

Ответы [ 7 ]

8 голосов
/ 05 августа 2011

Ничего подобного в стандартной библиотеке API нет. Natty - это библиотека, которая пытается это сделать, но вы должны знать, что это может быть только делом "наилучшего усилия", поскольку такие вещи, как 2/1/2012, просто неоднозначны: без метаинформации о формате, невозможно решить, будет ли это 1 февраля или 2 января.

2 голосов
/ 05 августа 2011

попробуйте DateFormat с форматом по умолчанию DateFormat.MEDIUM и SHORT.

public static void main(String[] args) {
    // Make a String that has a date in it, with MEDIUM date format
    // and SHORT time format.
    String dateString = "Nov 4, 2003 8:14 PM";

    // Get the default MEDIUM/SHORT DateFormat
    DateFormat format =
        DateFormat.getDateTimeInstance(
        DateFormat.MEDIUM, DateFormat.SHORT);

    // Parse the date
    try {
        Date date = format.parse(dateString);
        System.out.println("Original string: " + dateString);
        System.out.println("Parsed date    : " +
             date.toString());
    }
    catch(ParseException pe) {
        System.out.println("ERROR: could not parse date in string \"" +
            dateString + "\"");
    }

Отрезано из http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/

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

SimpleDateFormat df1 = new SimpleDateFormat( "dd/MM/yyyy" );
SimpleDateFormat df2 = new SimpleDateFormat( "dd-MM-yyyy" );

df1.parse(..)
df2.parse(..)

и т. д.

2 голосов
/ 05 августа 2011

Не совсем.BalusC написал блестящий пост на DateUtil , который "решает" большинство разборов форматов даты.

1 голос
/ 05 августа 2011

Если вы знакомы с форматом Simpledate, вы можете просто добавить несколько форматов даты в список / массив и делать их все подряд, пока один из них не достигнет действительной даты.

Проблема в следующем: что вы делаете с датой, такой как

06.07.2011

Это 6 июля или 7 июня?

Но, чтобы ответить на вопрос: нет, не существует «встроенного общего способа»

0 голосов
/ 05 августа 2011

Это большая проблема, в основном потому, что даты - нечеткая концепция - например, 02-01-2012 в феврале или январе?

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

0 голосов
/ 05 августа 2011

Вы можете использовать DateFormat.parse(...) и использовать локаль для форматирования даты, но это может не справиться со всеми этими случаями. Это также не так просто: рассмотрите следующие две возможные даты (которые одинаковы): 18/07/2011 и 07/18/2011 - как это следует анализировать, не зная, является ли это dd/mm/yyyy или mm/dd/yyyy (например, в Саудовская Аравия )?

0 голосов
/ 05 августа 2011

Вы не можете этого сделать.Рассмотрим «10-12-2011».Вы имеете в виду 10 декабря или 12 октября?Вы должны составить свой собственный список шаблонов, чтобы попробовать.Этот список будет варьироваться в зависимости от локали и того, как «ожидаемый» способ интерпретации даты кем-либо в этой стране / локали.

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