Строка в объект календаря - PullRequest
       2

Строка в объект календаря

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

Вот мой целевой формат:

19 августа 2011

И я пытаюсь преобразовать эту строку в объект календаря с помощью следующего кода, но переменная "date" остаетсяnull ..

SimpleDateFormat formatter ; 
        Date date = null ; 
        formatter = new SimpleDateFormat("dd MMM yyyy");
        try {
         date = formatter.parse(returnDate);
    } catch (ParseException e) {            
        e.printStackTrace();
    } 
        Calendar cal=Calendar.getInstance();
        cal.setTime(date);

Кто-нибудь знает, что происходит не так?Спасибо.

К вашему сведению, сообщение об исключении:

Неразборчивая дата: "19 августа 2011" на java.text.DateFormat.parse (Неизвестный источник)

Но я не думаю, что это полезно ...

Ответы [ 3 ]

7 голосов
/ 17 августа 2011

Что-то не так с анализом.Вы не узнаете об этом из-за этого:

 catch (ParseException e) {            

 } 

Это в основном говорит: «Мне все равно, что пойдет не так - игнорируйте это».При по крайней мере вы должны регистрировать ошибку и, скорее всего, допустить всплытие исключения.

Исключения являются невероятно важным диагностическим инструментом - не простопоймать их и игнорировать их.

РЕДАКТИРОВАТЬ: Теперь, когда вопрос изменился, мы можем видеть исключение - но код все еще продолжается, как будто ничего не произошло.Даже если вы do хотите в основном игнорировать исключение, вам нужно решить, какое значение вы * date будете иметь в случае сбоя анализа.Очевидно, что null бесполезен - поэтому вам нужно либо , чтобы исключение всплыло (чтобы вызывающий знал, что синтаксический анализ не удался) или возвращает некоторое значение разницы (например, дата по умолчанию,или сегодня, или что-то в этом роде).

Теперь, когда это происходит, разрешение всплывающего исключения также делает код проще.Это не вызывает исключения на моем компьютере, но, возможно, на вашем:

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

public class Test {

    public static void main(String[] args) throws Exception {
      Calendar cal = parseReturnDate("19 AUG 2011");
      System.out.println(cal);
    }

    public static Calendar parseReturnDate(String returnDate) 
        throws ParseException {
      SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy");
      Date date = formatter.parse(returnDate);
      Calendar cal=Calendar.getInstance();
      cal.setTime(date);
      return cal;
    }       
}

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

My думаю в том, что ваш часовой пояс по умолчанию не использует «AUG» в качестве короткого названия месяца - ноЯ не могу сказать, не видя исключения.В этом случае вы можете указать языковой стандарт при создании средства форматирования:

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",
                                                  Locale.US);

Вы можете также хотите указать часовой пояс.

(КакКроме того, Joda Time - намного превосходящий API для обработки даты и времени. Если вы потом проделаете значительную работу со значением, я бы определенно рекомендовал использовать его поверх Date / Calendar.)

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

SimpleDateFormat зависит от текущего календаря и календаря в локали по умолчанию. В зависимости от локали и календаря, возможно, «AUG» не является допустимым текстом для месяца.

AUG - допустимая строка для локали США, но не для локали ES.

Вы можете принудительно установить язык в США, добавив его в SimpleDateFormat:

SimpleDateFormat formatter = new SimpleDateFormat("dd MMM yyyy",Locale.US);

В локали США вы можете правильно проанализировать строку, если дата имеет 2 буквенных месяца США.

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

Я только что попробовал ваш код, и он отлично работает.Попробуйте выполнить следующее:

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Playground {

    public static void main(String... args) {

        String returnDate = "19 AUG 2011";
        SimpleDateFormat formatter ; 
        Date date = null ; 
        formatter = new SimpleDateFormat("dd MMM yyyy");

        try {
            date = formatter.parse(returnDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }

        System.out.println(date.toString());

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);

        System.out.println(cal.getTime().toString());
    }
}

ВЫХОД:

пт 19 августа 00:00:00 CAT 2011

пт 19 августа00:00:00 CAT 2011

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