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

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

ну, я уже успел это сделать :), но безобразно :(. Я делаю это с большим количеством "если-> чем", что действительно ужасно, и что бы я ни хотел добавить какое-то новое правило, например дата старше одного года, я хочу поставить строку, как в прошлом году или около того .... Мне действительно нужно добавить некрасивую логику.

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

есть ли подход к купальщику, чем тысяча если? если нет, то спасибо, по крайней мере, я перестану искать решение для купальщика

любые предложения, сниппет или около того будут оценены

Спасибо

Ответы [ 6 ]

43 голосов
/ 19 сентября 2011

Вы можете попробовать getRelativeDateTimeString в DateUtils http://developer.android.com/reference/android/text/format/DateUtils.html

10 голосов
/ 18 сентября 2011

Я обычно использую эту удобную библиотеку Java для форматирования относительного времени. Библиотека времени прети

4 голосов
/ 06 декабря 2015
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 голосов
/ 17 октября 2018

getRelativeTimeSpanString добавлено на уровне API 3

getRelativeTimeSpanString (долгое время, долго, длительное минимальное разрешение)

Возвращает строку, описывающую «время» как время относительно «сейчас».

Промежуток времени в прошлом форматируется как «42 минуты назад». Промежуток времени в будущем отформатирован как «За 42 минуты». Более подробную информацию вы можете найти здесь:

https://developer.android.com/reference/android/text/format/DateUtils

    Calendar now = Calendar.getInstance();
    return DateUtils.getRelativeTimeSpanString(time, now.getTimeInMillis(), DateUtils.DAY_IN_MILLIS);
0 голосов
/ 16 июля 2017

Для 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;
    }
}
0 голосов
/ 04 декабря 2014

Попробуйте, я реализовал это, используя 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...