Преобразование календарной даты в строку?

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

Я пробовал использовать:

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

5 ответов


предполагая, что view.getSelectedDay() возвращает Calendar, вы можете просто хочу:

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

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

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


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


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

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

int i = s.compareTo(s2);

System.out.println(i);

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

вы можете счесть более разумным преобразовать строку date в объект Date, а затем использовать before () или после.)(


лучше всего было бы сравнить 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 если они равны, согласно документальное дата или of Календарь.

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

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

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

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


при сравнении дат в виде строк вы должны использовать 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;
}