Преобразование календарной даты в строку?
Я должен сравнить две даты, где первая дата находится в формате календаря, а другая-в формате строки(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
документация.
вы сравниваете значения, чтобы определить, является ли одной даты до другой, или для сортировки? Если вы находитесь, вы можете столкнуться с каким-то порядком 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;
}