Ответ 1
Обычно я использую эту удобную java-библиотеку для форматирования Relative Time. Библиотека времени Prety
У меня есть текстовое представление даты. И мой текст содержит строку даты, например, 2011.09.17. Ну, я все еще хочу это сделать, но я также хочу добавить более удобную для вас информацию для некоторых конкретных дат, таких как сегодня или вчера. Например, если сегодня 2011.09.17, я хочу, чтобы мой текст имел значение вчера вместо 2011.09.16 и сегодня вместо 2011.09.17.
я уже успел это сделать :), но уродливо :( Я делаю это с большим количеством if->, чем "что действительно уродливо и что когда-либо я хочу добавить какое-то новое правило, например, если дата старше одного года, я хочу поставить строку, как в прошлом году или так... Мне действительно нужно добавить уродливую логику.
Мой вопрос в том, есть ли лучший способ сделать это? есть ли что-то вроде шаблона дизайна для этого? Каков рекомендуемый способ сделать это? Я уверен, что многие люди сталкиваются с такими проблемами
если есть какой-то подход к купальщику, чем тысячи из них? если не поблагодарить, по крайней мере, я остановлю поиск решения для купания
любые предложения, фрагменты или так будут оценены
благодаря
Обычно я использую эту удобную java-библиотеку для форматирования Relative Time. Библиотека времени Prety
Вы можете попробовать getRelativeDateTimeString
в DateUtils http://developer.android.com/reference/android/text/format/DateUtils.html
public class RelativeWeekday {
private final Calendar mCalendar;
public RelativeWeekday(Calendar calendar) {
mCalendar = calendar;
}
@Override
public String toString() {
Calendar today = Calendar.getInstance(Locale.getDefault());
int dayOfYear = mCalendar.get(Calendar.DAY_OF_YEAR);
if (Math.abs(dayOfYear - today.get(Calendar.DAY_OF_YEAR)) < 2) {
return getRelativeDay(today);
}
return getWeekDay();
}
private String getRelativeDay(Calendar today) {
return DateUtils.getRelativeTimeSpanString(
mCalendar.getTimeInMillis(),
today.getTimeInMillis(),
DateUtils.DAY_IN_MILLIS,
DateUtils.FORMAT_SHOW_WEEKDAY).toString();
}
private String getWeekDay() {
SimpleDateFormat dayFormat = new SimpleDateFormat("EEEE");
return dayFormat.format(mCalendar.getTimeInMillis());
}
}
Попробуйте это, я реализовал его с помощью joda-datatime2.2.jar и java SimpleDateFormat
import java.text.SimpleDateFormat;
import java.util.Date;
import org.joda.time.DateMidnight;
import org.joda.time.DateTime;
import org.joda.time.Days;
public class SmartDateTimeUtil {
private static String getHourMinuteString(Date date){
SimpleDateFormat hourMinuteFormat = new SimpleDateFormat(" h:m a");
return hourMinuteFormat.format(date);
}
private static String getDateString(Date date){
SimpleDateFormat dateStringFormat = new SimpleDateFormat("EEE',' MMM d y',' h:m a");
return dateStringFormat.format(date);
}
private static boolean isToday (DateTime dateTime) {
DateMidnight today = new DateMidnight();
return today.equals(dateTime.toDateMidnight());
}
private static boolean isYesterday (DateTime dateTime) {
DateMidnight yesterday = (new DateMidnight()).minusDays(1);
return yesterday.equals(dateTime.toDateMidnight());
}
private static boolean isTomorrow(DateTime dateTime){
DateMidnight tomorrow = (new DateMidnight()).plusDays(1);
return tomorrow.equals(dateTime.toDateMidnight());
}
private static String getDayString(Date date) {
SimpleDateFormat weekdayFormat = new SimpleDateFormat("EEE',' h:m a");
String s;
if (isToday(new DateTime(date)))
s = "Today";
else if (isYesterday(new DateTime(date)))
s = "Yesterday," + getHourMinuteString(date);
else if(isTomorrow(new DateTime(date)))
s = "Tomorrow," +getHourMinuteString(date);
else
s = weekdayFormat.format(date);
return s;
}
public static String getDateString_shortAndSmart(Date date) {
String s;
DateTime nowDT = new DateTime();
DateTime dateDT = new DateTime(date);
int days = Days.daysBetween(dateDT, nowDT).getDays();
if (isToday(new DateTime(date)))
s = "Today,"+getHourMinuteString(date);
else if (days < 7)
s = getDayString(date);
else
s = getDateString(date);
return s;
}
}
Простые случаи использования и тестирования класса Util:
import java.util.Calendar;
import java.util.Date;
public class SmartDateTimeUtilTest {
public static void main(String[] args) {
System.out.println("Date now:"+SmartDateTimeUtil.getDateString_shortAndSmart(new Date()));
System.out.println("Date 5 days before :"+SmartDateTimeUtil.getDateString_shortAndSmart(getFutureDay(-5)));
System.out.println("Date 1 day before :"+SmartDateTimeUtil.getDateString_shortAndSmart(getFutureDay(-1)));
System.out.println("Date last month:"+SmartDateTimeUtil.getDateString_shortAndSmart(getFutureMonth(-1)));
System.out.println("Date last year:"+SmartDateTimeUtil.getDateString_shortAndSmart(getFutureDate(-1)));
System.out.println("Date 1 day after :"+SmartDateTimeUtil.getDateString_shortAndSmart(getFutureDay(1)));
}
public static Date getFutureDate(int numberOfYears){
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.YEAR, numberOfYears);
return c.getTime();
}
public static Date getFutureMonth(int numberOfYears){
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.MONTH, numberOfYears);
return c.getTime();
}
public static Date getFutureDay(int numberOfYears){
Calendar c = Calendar.getInstance();
c.setTime(new Date());
c.add(Calendar.DATE, numberOfYears);
return c.getTime();
}
}
Для android Использовать библиотеку JodaTime в файле build.gradle:
compile 'net.danlew: android.joda: 2.9.9'
public static String formateddate(String date) {
DateTime dateTime = DateTimeFormat.forPattern("dd-MMM-yyyy").parseDateTime(date);
DateTime today = new DateTime();
DateTime yesterday = today.minusDays(1);
DateTime twodaysago = today.minusDays(2);
DateTime tomorrow= today.minusDays(-1);
if (dateTime.toLocalDate().equals(today.toLocalDate())) {
return "Today ";
} else if (dateTime.toLocalDate().equals(yesterday.toLocalDate())) {
return "Yesterday ";
} else if (dateTime.toLocalDate().equals(twodaysago.toLocalDate())) {
return "2 days ago ";
} else if (dateTime.toLocalDate().equals(tomorrow.toLocalDate())) {
return "Tomorrow ";
} else {
return date;
}
}