2011-09-18 15 views
13

Tengo una fecha textview. Y mi vista de texto contiene una cadena de fechas como 2011.09.17. Bueno, todavía quiero tener eso, pero también quiero agregar más información fácil de usar para algunas fechas específicas como hoy o ayer. Por ejemplo, si hoy es 2011.09.17, quiero que mi textview tenga el valor de ayer en lugar de 2011.09.16 y hoy, en su lugar, 2011.09.17.Manera correcta de dar formato a la fecha con cadenas como hoy, ayer, mañana, etc.

Bueno, ya he logrado hacer esto :), pero de la manera fea :(. Hago esto con mucha 'if-> than' que es realmente fea y lo que quiera agregar alguna regla nueva como si la fecha es anterior a un año quiero poner una cadena como el año pasado más o menos ... Realmente necesito agregar lógica fea.

Mi pregunta es, ¿hay alguna manera más agradable de hacer esto? ¿hay algo como esto? patrón de diseño para esto? ¿Cuál es la manera recomendada de hacer esto? Estoy seguro de que muchas personas han encontrado este tipo de problemas

si hay un poco de enfoque de bañistas que mil de si? ​​si no, de alguna manera al menos voy a parar buscando la solución de bañista

alguna sugerencia, fragmento o para lo que se apreciará

Gracias

+0

comprobar mi respuesta aquí https: // stackoverflow. com/a/46086798/578309 – thanhbinh84

Respuesta

9

que suelo utilizar esta biblioteca práctica desarrollada en Java para formatear el tiempo relativo. Prety Time Library

+3

url abrir la página vacía – Furqan

0

Prueba esto, he implementado usando joda-datatime2.2.jar y SimpleDateFormat java

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; 
} 

} 

casos simples de usar y probar la clase 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(); 
    } 
} 
+0

Solo indicando que DateMidnight ha quedado obsoleto. Reemplazar DateMidnight con LocalDate debería funcionar con las versiones más recientes de Joda-Time. – dabarnard

2
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());     
    }     
} 
0

para Android biblioteca Uso JodaTime en el archivo build.gradle:

compilación '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; 
    } 
} 
Cuestiones relacionadas