Правильный способ форматирования даты с такими строками, как сегодня, вчера, завтра и т. Д.

У меня есть текстовое представление даты. И мой текст содержит строку даты, например, 2011.09.17. Ну, я все еще хочу этого, но я также хочу добавить более удобную для вас информацию для некоторых конкретных дат, таких как сегодня или вчера. Например, если сегодня 2011.09.17, я хочу, чтобы мой textview имел значение вчера вместо 2011.09.16 и сегодня вместо 2011.09.17.

Я уже успел это сделать :), но уродливо 🙁 Я делаю это с большим количеством «if-> than», которое действительно уродливо и что когда-либо я хочу добавить какое-то новое правило, например, если дата Старше одного года, я хочу поставить строку, как в прошлом году или около того … Мне действительно нужно добавить уродливую логику.

Мой вопрос в том, есть ли лучший способ сделать это? Есть ли что-то вроде шаблона дизайна для этого? Каков рекомендуемый способ сделать это? Я уверен, что многие люди сталкиваются с такими проблемами

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

Любые предложения, фрагменты или так будут оценены

благодаря

Solutions Collecting From Web of "Правильный способ форматирования даты с такими строками, как сегодня, вчера, завтра и т. Д."

Обычно я использую эту удобную 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:ma"); return hourMinuteFormat.format(date); } private static String getDateString(Date date){ SimpleDateFormat dateStringFormat = new SimpleDateFormat("EEE',' MMM d y',' h:ma"); 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:ma"); 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; } }