2011-09-18 19 views
13

Bir tarih yazım var. Ve benim metin görüşümde, 2011.09.17 gibi bir tarih dizesi var. Peki hala bunu yapmak istiyorum ama aynı zamanda bugün veya dün gibi bazı belirli tarihler için daha fazla kullanıcı dostu bilgi eklemek istiyorum. Örneğin, bugün 2011.09.17 ise, bugünkü görüşümün 2011.09.16 yerine 2011.09.17 yerine bugünkü değerini almasını istiyorum.Bugün, dün, yarın gibi dizelerle tarihi biçimlendirmenin doğru yolu

peki zaten bunu yapmayı başardım :), ama çirkin şekilde :(. Bunu gerçekten çok çirkin olan 'if-> than' ile yapıyorum ve ne gibi yeni kurallar eklemek istiyorum Eğer tarih bir yıldan eskiyse, geçen yıl olduğu gibi dize koymak istiyorum .... Gerçekten çirkin mantığı eklemem gerekir.

Sorum şu: Bunu yapmak için daha iyi bir yol var mı? Bu için tasarım deseni nedir? Bunu yapmak için önerilen yol nedir? Eminim ki birçok kişi bu tür sorunlarla karşılaştığından eminim

Binlerce ifs'den biraz daha fazla yaklaşım varsa? yıkıcı çözüm arayışı

herhangi bir öneri, pasajı ya da öylesine

Teşekkür

+0

burada cevabımı edin https: // stackoverflow. com/a/46086798/578309 – thanhbinh84

cevap

9

Genellikle Göreli Zaman biçimlendirme için bu kullanışlı java kütüphanesi kullanmak takdir edilecektir. Prety Time Library

+3

url açık boş sayfa – Furqan

0

bu deneyin DateUtils içinde getRelativeDateTimeString deneyebilirsiniz i kullanmak ve Util sınıfını test etmek

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

} 

Basit durumlarda joda-datatime2.2.jar ve java SimpleDateFormat kullanarak hayata :

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

Sadece DateMidnight'ın kullanımdan kaldırıldığını belirterek. DateMidnight öğesinin LocalDate ile değiştirilmesi, Joda-Time'ın daha yeni sürümleriyle çalışmalıdır. – 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

derleme: build.gradle dosyasında android Kullanım JodaTime kütüphane için'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; 
    } 
} 
İlgili konular