Wonky знакомства на Яве - PullRequest
       25

Wonky знакомства на Яве

2 голосов
/ 28 января 2012

Следующий код Java просто анализирует дату (с временной частью) 2009-01-28-09:11:12, используя SimpleDateFormat. Давайте посмотрим на это.

final public class Main
{
    public static void main(String[] args)
    {            
        try
        {
            DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
            Date d = df.parse("2009-01-28-09:11:12");
            System.out.println(d);
        }
        catch (ParseException ex)
        {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

Дата (со временем), отображаемая (после синтаксического анализа) вышеуказанным кодом, выглядит следующим образом:

Sun Nov 30 22:07:51 IST 2008

даже если мы пытаемся разобрать дату 2009-01-28-09:11:12. Это выглядит несколько странно. Почему так разбирается?

Ответы [ 3 ]

5 голосов
/ 28 января 2012

Разве ваш формат даты не должен выглядеть примерно так:

DateFormat df = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");

, чтобы соответствовать этому формату:

Date d = df.parse("2009-01-28-09:11:12");

?

Почему, согласно этому:

синтаксический анализатор фактически смотрит на них как на числа, и хитрость в том, что - это часть числа, представляющая отрицательные числа.Так что если вы сделаете:

df.parse("2009-01-02-00:00:00")

, то получится:

Mon Dec 01 00:02:00 EST 2008

, который анализирует 2009 как гггг, затем -0 как MM (то есть предыдущий месяц, когда месяцы начинаются с 1), затем1 как дд и т. Д.

Согласно синтаксическому анализу в DateFormat:

По умолчанию синтаксический анализ является мягким: есливходные данные не в форме, используемой методом форматирования этого объекта, но могут все еще быть проанализированы как дата, тогда анализ успешно завершен.Клиенты могут настаивать на строгом соблюдении формата, вызывая setLenient (false).

Полагаю, если у вас есть возможность, было бы лучше использовать косые черты вместо черточек, если вам нравятся форматы, такие как 2009/01/02 12:34:56.Это:

df.parse("2009/01/02-00:00:00")

сгенерирует исключение:

ERROR java.text.ParseException:
Unparseable date: "2009/01/02-00:00:00"

Я могу только заключить, что это очень хорошо, что / не считается делением чисел по DateFormat ...

2 голосов
/ 28 января 2012

Ну, вы можете определить формат, который вы на самом деле анализируете ...

1 голос
/ 28 января 2012

Даты разбираются в мягком режиме по умолчанию.Это означает, что он прощает такие ошибки, как разбор 29 февраля за 1 марта, если это не високосный год.То, что вы просите разобрать, - это 28-й день -1-го месяца 2009 года, и оно старательно пытается дать вам именно то, о чем вы просите.

Чтобы отключить это поведение, вызовите format.setLenient (false).Тогда dateformat сгенерирует исключение, если вы попытаетесь проанализировать что-то, что не является реальной датой.

...