Преобразование календарной даты в строку? - PullRequest
8 голосов
/ 06 сентября 2011

Мне нужно сравнить две даты, где первая дата в формате календаря, а другая в строковом (DD-MMM-гггг) формате Поэтому я хочу преобразовать одну из дат Календаря в строку и использовать метод CompareTo.

Я пытался использовать:

SimpleDateFormat formatter=new SimpleDateFormat("DD-MMM-yyyy");  
String currentDate=formatter.format(view.getSelectedDay());    

Ответы [ 5 ]

11 голосов
/ 06 сентября 2011

Если view.getSelectedDay() возвращает Calendar, вы можете просто захотеть:

String currentDate = formatter.format(view.getSelectedDay().getTime());

(чтобы у вас была ссылка Date для передачи в format.)

Если это не проблема, пожалуйста, дайте больше информации.Я подозреваю, что вы также хотите "дд" вместо "ДД", кстати."DD" - это день года , тогда как "dd" - это день месяца , согласно документации SimpleDateFormat.

1 голос
/ 06 сентября 2011

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

String s  = "12-11-2001";
String s2 = "13-11-2000";

int i = s.compareTo(s2);

System.out.println(i);

выходное значение равно -1, где оно должно быть 1, так как s2 как DATE предшествует s,но s2 лексикографически после s при сортировке в порядке возрастания.

Может оказаться более целесообразным преобразовать строковую дату в объект Date, а затем использовать before () или after ().

1 голос
/ 06 сентября 2011

вот ваша проблема решена.В любом случае, зачем сравнивать даты через их строковые представления?Не лучше ли сравнить объекты Date, например здесь ?Вы можете получить объект Date с помощью метода getTime () класса Calendar.

0 голосов
/ 09 октября 2014

При сравнении дат в виде строк следует использовать SimpleDateFormat("yyyy-MM-dd"). Сравнение их с использованием формата SimpleDateFormat("dd-MM-yyyy") в большинстве случаев будет неверным из-за того, что наименее значимое число проверяется первым, а самое значимое проверяется последним.
Если вы должны использовать формат dd-MM-yyyy, вы можете написать функцию, которая разбивает строки, затем сравнивает год / месяц / день в правильном порядке и возвращает положительный, отрицательный или ноль.

// Compares first date to second date and returns an integer
// can be used in a similar manner as String.CompareTo()
Public Static int CompareDates(String Date1, String Date2) {
    String[] splitDate1 = Date1.split("-");
    String[] splitDate2 = Date2.split("-");
    int ret = -1;

    if (splitDate1[2].CompareTo(splitDate2[2]) == 0) {
        if (spliDatet1[1].CompareTo(splitDate2[1]) == 0) {
            if (splitDate1[0].CompareTo(splitDate2[0]) == 0) {
                ret = 0;
            }
            else if (splitDate1[0].CompareTo(splitDate2[0]) > 0) {
                ret = 1;
            }
        }
        else if (splitDate1[1].CompareTo(splitDate2[1]) > 0) {
            ret = 1;
        }
    }
    else if (splitDate1[2].CompareTo(splitDate2[2]) > 0) {
        ret = 1;
    }
    Return ret;
}
0 голосов
/ 06 сентября 2011

Лучше всего сравнить Date объекты или Calendar объекты, я думаю.Очень разлагается, это дает:

  • Сравнение Date объектов

    final Calendar calendarDate = your_date_as_a_Calendar;
    
    final String stringDate = your_date_as_a_String;
    final SimpleDateFormat format = new SimpleDateFormat("DD-MMM-yyyy");
    
    final Date dateA = calendarDate.getTime(); // this gives the absolute time, that actually embeds the date!
    final Date dateB = format.parse(stringDate);
    
    final int comparison = dateA.compareTo(dateB);
    
  • Сравнение Calendar объектов

    final Calendar calendarA = your_date_as_a_Calendar;
    
    final String stringDate = your_date_as_a_String;
    final SimpleDateFormat format = new SimpleDateFormat("DD-MMM-yyyy");
    
    final Calendar calendarB = new GregorianCalendar();
    calendarB.setTime(format.parse(stringDate));
    
    final int comparison = calendarA.compareTo(calendarB);
    

И тогда comparison будет < 0, если A < B, > 0, если A > B, и == 0, если они равны, согласно документации Date. или Календаря .

Единственное, с чем вам следует быть осторожным:

  • Время дня: если вашСтавка Calendar установлена ​​в тот же день, что и ваша String, но с другим часом это не сработает (здесь мы сравниваем мгновений )

  • Шаблон SimpleDateFormat: он должен соответствовать формату вашего String, иначе вы получите странные результаты

  • Язык: ваши даты могут относиться к одному и тому же моменту, но будутразные, если они выражены в разных часовых поясах!Если вам придется справиться с этим, вам придется позаботиться о TimeZone при использовании Calendar (подробности см. В документе Календарь и TimeZone ).

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