2010-09-19 8 views
27

Comment obtenir ce jour avant dans une semaine dans Android dans ce format:date get Android avant 7 jours (une semaine)

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

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

Merci

Répondre

78

Parse la date:

Date myDate = dateFormat.parse(dateString); 

Et puis soit de savoir combien de Millis econdes vous devez soustraire:

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

Ou utilisez l'API fournie par la 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 avez besoin, le convertir en une chaîne:

String date = dateFormat.format(newDate); 
+0

Je pense que vous devriez utiliser Calendar.roll() au lieu de Calendar.add() si vous voulez gérer la modification mois/année. Votre exemple pourrait être faux entre le 1er et le 6 janvier. –

+6

Je pense que le contraire est vrai: roll() ne gère pas les changements mois/année lorsqu'il est appelé sur la date, tandis que add() le fait. –

+1

Ok, mon mauvais! ;-) –

1

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"); 
    

Solution 1 est le moyen java "officiel", mais en utilisant un GregorianCalendar peut avoir de graves problèmes de performances afin que les ingénieurs Android ont ajouté l'objet android.text.format.Time pour résoudre ce problème.

+0

La méthode roll n'affecte pas les autres champs, donc vous serez toujours bloqué le même mois, même si vous essayez de revenir 7 jours après le premier jour du mois. –

+1

Vous avez raison, j'ai corrigé l'exemple. Quoi qu'il en soit, mon point était plus sur l'utilisation de android.text.format.Time qui est préféré si vous mettez à jour une date dans un élément ListView. Utiliser GregorianCalendar pourrait empêcher votre liste de défiler très rapidement. –

+0

Merci, notez collègues programmeurs le premier exemple ici devrait formater (someDate.getTime()) plutôt que juste someDate –

13

J'ai créé ma propre fonction qui peut utile pour obtenir Suivant/Date 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 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 
+1

Mieux que accepté, merci! –

4

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 de 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 autour du globe par zone. Par exemple, quelques minutes après minuit dans Paris France est un nouveau jour alors qu'encore "hier" dans Montréal Québec.

Spécifiez un proper time zone name dans le format de continent/region, tels que America/Montreal, Africa/Casablanca ou Pacific/Auckland. N'utilisez jamais l'abréviation de 3 à 4 lettres telle que EST ou IST car ce sont des et non des fuseaux horaires, non normalisés, et même pas uniques (!).

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

faire quelques calculs en utilisant les méthodes minus… et plus….

LocalDate weekAgo = now.minusWeeks(1); 

Laissez java.time déterminer le premier moment du jour pour votre fuseau horaire. Ne supposez pas que la journée commence à 00:00:00. Des anomalies telles que l'heure d'été signifient que le jour peut commencer à une autre heure, par exemple 01:00:00.

ZonedDateTime weekAgoStart = weekAgo.atStartOfDay(z) ; 

Générer une chaîne représentant cet objet ZonedDateTime à l'aide d'un objet DateTimeFormatter. Rechercher Stack Overflow pour beaucoup plus de 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 SPACE par T.

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

A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes de date-heure legacy gênantes telles que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time.

Pour en savoir plus, voir 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?

  • Java SE 8, Java SE 9, et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android

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 considérablement le travail de la date et de l'heure.

Notez l'utilisation d'un fuseau horaire. Si cette option est omise, vous travaillez dans 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(); 
Questions connexes