web-dev-qa-db-fra.com

Android obtenir la date avant 7 jours (une semaine)

Comment obtenir la date avant une semaine à partir de maintenant en Android dans ce format:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

ex: maintenant 2010-09-19 HH:mm:ss, avant une semaine 2010-09-12 HH:mm:ss

Merci

37
Jovan

Analyser la date:

Date myDate = dateFormat.parse(dateString);

Et puis, déterminez combien de millisecondes vous devez soustraire:

Date newDate = new Date(myDate.getTime() - 604800000L); // 7 * 24 * 60 * 60 * 1000

Ou utilisez l'API fournie par le Java.util.Calendar classe:

Calendar calendar = Calendar.getInstance();
calendar.setTime(myDate);
calendar.add(Calendar.DAY_OF_YEAR, -7);
Date newDate = calendar.getTime();

Ensuite, si vous en avez besoin, convertissez-le à nouveau en une chaîne:

String date = dateFormat.format(newDate);
95
Dan Dyer

J'ai créé ma propre fonction qui peut être utile pour obtenir la date suivante/précédente de

Date actuelle:

/**
 * Pass your date format and no of days for minus from current 
 * If you want to get previous date then pass days with minus sign
 * else you can pass as it is for next date
 * @param dateFormat
 * @param days
 * @return Calculated Date
 */
public static String getCalculatedDate(String dateFormat, int days) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat s = new SimpleDateFormat(dateFormat);
    cal.add(Calendar.DAY_OF_YEAR, days);
    return s.format(new Date(cal.getTimeInMillis()));
}

Exemple:

getCalculatedDate("dd-MM-yyyy", -10); // It will gives you date before 10 days from current date

getCalculatedDate("dd-MM-yyyy", 10);  // It will gives you date after 10 days from current date

et si vous voulez obtenir la date calculée en passant votre propre date:

public static String getCalculatedDate(String date, String dateFormat, int days) {
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat s = new SimpleDateFormat(dateFormat);
    cal.add(Calendar.DAY_OF_YEAR, days);
    try {
        return s.format(new Date(s.parse(date).getTime()));
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        Log.e("TAG", "Error in Parsing Date : " + e.getMessage());
    }
    return null;
}

Exemple avec passage de sa propre date:

getCalculatedDate("01-01-2015", "dd-MM-yyyy", -10); // It will gives you date before 10 days from given date

getCalculatedDate("01-01-2015", "dd-MM-yyyy", 10);  // It will gives you date after 10 days from given date
17

tl; dr

LocalDate
    .now( ZoneId.of( "Pacific/Auckland" ) )           // Get the date-only value for the current moment in a specified time zone.
    .minusWeeks( 1 )                                  // Go back in time one week.
    .atStartOfDay( ZoneId.of( "Pacific/Auckland" ) )  // Determine the first moment of the day for that date in the specified time zone.
    .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )  // Generate a string in standard ISO 8601 format.
    .replace( "T" , " " )                             // Replace the standard "T" separating date portion from time-of-day portion with a SPACE character.

Java.time

L'approche moderne utilise les classes Java.time.

La classe LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde par zone. Par exemple, quelques minutes après minuit à Paris France est un nouveau jour alors qu'il est encore "hier" à Montréal Québec .

Spécifiez un nom de fuseau horaire correct au format continent/region, comme America/Montreal , Africa/Casablanca , ou Pacific/Auckland. N'utilisez jamais l'abréviation de 3-4 lettres telle que EST ou IST car ils sont pas vrais fuseaux horaires, non standardisés, et même pas uniques (!).

ZoneId z = ZoneId.forID( "America/Montreal" ) ;
LocalDate now = LocalDate.now ( z ) ;

Faites quelques calculs en utilisant le minus… et plus… méthodes.

LocalDate weekAgo = now.minusWeeks( 1 );

Laissez Java.time déterminer le premier moment de la journée pour votre fuseau horaire souhaité. Ne présumez pas que la journée commence à 00:00:00. Des anomalies telles que l'heure d'été signifient que la journée peut commencer à un autre moment de la journée tel que 01:00:00.

ZonedDateTime weekAgoStart = weekAgo.atStartOfDay( z ) ;

Générez une chaîne représentant cet objet ZonedDateTime à l'aide d'un objet DateTimeFormatter. Recherchez Stack Overflow pour de nombreuses autres discussions sur cette classe.

DateTimeFormatter f = DateTimeFormatter.ISO_LOCAL_DATE_TIME ;
String output = weekAgoStart.format( f ) ;

Ce format standard est proche de ce que vous voulez, mais a un T au milieu où vous voulez un ESPACE. Remplacez donc ESPACE par T.

output = output.replace( "T" , " " ) ;

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien héritage gênant classes date-heure telles que Java.util.Date , Calendar , & SimpleDateFormat .

Le projet Joda-Time , désormais en mode de maintenance , conseille la migration vers le Java.time Des classes.

Pour en savoir plus, consultez le Oracle Tutorial . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time?

Joda-Time

Mise à jour: Le projet Joda-Time est maintenant en mode maintenance. L'équipe conseille la migration vers les classes Java.time.

L'utilisation de la bibliothèque Joda-Time facilite le travail de la date et de l'heure.

Notez l'utilisation d'un fuseau horaire. Si omis, vous travaillez en UTC ou dans le fuseau horaire par défaut actuel de la JVM.

DateTime now = DateTime.now ( DateTimeZone.forID( "America/Montreal" ) ) ;
DateTime weekAgo = now.minusWeeks( 1 );
DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay();
6
Basil Bourque

Je peux voir deux façons:

  1. Utilisez un GregorianCalendar :

    Calendar someDate = GregorianCalendar.getInstance();
    someDate.add(Calendar.DAY_OF_YEAR, -7);
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String formattedDate = dateFormat.format(someDate);
    
  2. Utilisez un Android.text.format.Time :

    long yourDateMillis = System.currentTimeMillis() - (7 * 24 * 60 * 60 * 1000);
    Time yourDate = new Time();
    yourDate.set(yourDateMillis);
    String formattedDate = yourDate.format("%Y-%m-%d %H:%M:%S");
    

La solution 1 est la méthode "officielle" Java, mais l'utilisation d'un GregorianCalendar peut avoir de graves problèmes de performances, donc Android ont ajouté Android.text.format.Time objet de résoudre ce problème.

1
Kevin Gaudin
public static Date getDateWithOffset(int offset, Date date){
    Calendar calendar = calendar = Calendar.getInstance();;
    calendar.setTime(date);
    calendar.add(Calendar.DAY_OF_MONTH, offset);
    return calendar.getTime();
}

Date weekAgoDate = getDateWithOffset(-7, new Date());

OU en utilisant Joda:

ajouter la bibliothèque Joda

    implementation 'joda-time:joda-time:2.10'

"

DateTime now = new DateTime();
DateTime weekAgo = now.minusWeeks(1);
Date weekAgoDate = weekAgo.toDate()// if you want to convert it to Date

-----------------------------MISE À JOUR-------------------- -----------

Utilisez Java 8 API ou ThreeTenABP pour Android (minSdk <24).

ThreeTenABP:

implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

"

LocalDate now= LocalDate.now();
now.minusWeeks(1);
0
Islam Assi

Vous pouvez utiliser ce code pour obtenir la chaîne exacte que vous souhaitez.

object DateUtil{
    fun timeAgo(context: Context, time_ago: Long): String {
        val curTime = Calendar.getInstance().timeInMillis / 1000
        val timeElapsed = curTime - (time_ago / 1000)
        val minutes = (timeElapsed / 60).toFloat().roundToInt()
        val hours = (timeElapsed / 3600).toFloat().roundToInt()
        val days = (timeElapsed / 86400).toFloat().roundToInt()
        val weeks = (timeElapsed / 604800).toFloat().roundToInt()
        val months = (timeElapsed / 2600640).toFloat().roundToInt()
        val years = (timeElapsed / 31207680).toFloat().roundToInt()

        // Seconds
        return when {
            timeElapsed <= 60 -> context.getString(R.string.just_now)
            minutes <= 60 -> when (minutes) {
                1 -> context.getString(R.string.x_minute_ago, minutes)
                else -> context.getString(R.string.x_minute_ago, minutes)
            }
            hours <= 24 -> when (hours) {
                1 -> context.getString(R.string.x_hour_ago, hours)
                else -> context.getString(R.string.x_hours_ago, hours)
            }
            days <= 7 -> when (days) {
                1 -> context.getString(R.string.yesterday)
                else -> context.getString(R.string.x_days_ago, days)
            }
            weeks <= 4.3 -> when (weeks) {
                1 -> context.getString(R.string.x_week_ago, weeks)
                else -> context.getString(R.string.x_weeks_ago, weeks)
            }
            months <= 12 -> when (months) {
                1 -> context.getString(R.string.x_month_ago, months)
                else -> context.getString(R.string.x_months_ago, months)
            }
            else -> when (years) {
                1 -> context.getString(R.string.x_year_ago, years)
                else -> context.getString(R.string.x_years_ago, years)
            }
        }
    }

}
0
Prashant Jajal