2010-09-19 16 views
27

come ottenere data prima una settimana da oggi in Android in questo formato:data get Android prima di 7 giorni (una settimana)

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

es: ora 2010-09-19 HH:mm:ss, prima di uno settimana 2010-09-12 HH:mm:ss

Grazie

risposta

78

Analizzare la data:

Date myDate = dateFormat.parse(dateString); 

E allora o capire come molti millis econds è necessario sottrarre:

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

Oppure utilizzare le API fornite dalla classe java.util.Calendar:

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

Quindi, se è necessario, riconvertirlo in una stringa:

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

Penso che dovresti usare Calendar.roll() invece di Calendar.add() se vuoi gestire il cambio mese/anno giusto. Il tuo esempio potrebbe essere sbagliato tra il 1 ° e il 6 gennaio. –

+6

Penso che sia vero il contrario: roll() non gestisce le modifiche mese/anno quando viene chiamato alla data, mentre add() lo fa. –

+1

Ok, mio ​​male! ;-) –

1

Sono in grado di vedere due modi:

  1. Utilizzare 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. Utilizzare 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"); 
    

Soluzione 1 è il modo "ufficiale" java, ma utilizzando un GregorianCalendar può avere gravi problemi di prestazioni in modo da ingegneri Android hanno aggiunto l'oggetto android.text.format.Time per risolvere questo problema.

+0

Il metodo roll non ha alcun effetto sugli altri campi, quindi resterai bloccato nello stesso mese, anche se cerchi di tornare indietro di 7 giorni dal primo del mese. –

+1

Hai ragione, ho corretto l'esempio. Ad ogni modo, il mio punto era più sull'uso di android.text.format.Time che è preferibile se si aggiorna una data in un oggetto ListView. L'uso di GregorianCalendar potrebbe impedire al tuo elenco di scorrere molto velocemente. –

+0

Grazie, noti colleghi programmatori, il primo esempio qui dovrebbe essere formattato (someDate.getTime()) piuttosto che solo alcuniData –

13

ho creato la mia propria funzione che possono utile per ottenere successivo/Data anteriore da

Data attuale:

/** 
* 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())); 
} 

Esempio:

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 

e se si vuoi ottenere la data calcolata con il passaggio la tua data:

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

Esempio con Passando propria data:

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

Meglio di quanto accettato, grazie! –

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'approccio moderno utilizza le classi java.time.

La classe LocalDate rappresenta un valore di sola data senza ora del giorno e senza fuso orario.

Un fuso orario è fondamentale per determinare una data. Per un dato momento, la data varia in tutto il mondo per zona. Ad esempio, pochi minuti dopo la mezzanotte in Paris France è un nuovo giorno mentre è ancora "ieri" in Montréal Québec.

Specificare un proper time zone name nel formato continent/region, come ad esempio America/Montreal, Africa/Casablanca o Pacific/Auckland. Non utilizzare mai l'abbreviazione di 3-4 lettere come EST o IST poiché sono non fusi orari reali, non standardizzati e nemmeno univoci (!).

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

fare alcuni matematica utilizzando i minus… e plus… metodi.

LocalDate weekAgo = now.minusWeeks(1); 

Lascia che java.time determini il primo momento della giornata per il fuso orario desiderato. Non pensare che la giornata inizi al 00:00:00. Anomalie come Daylight Saving Time significa che il giorno potrebbe iniziare in un altro momento della giornata, ad esempio 01:00:00.

ZonedDateTime weekAgoStart = weekAgo.atStartOfDay(z) ; 

generare una stringa che rappresenta l'oggetto ZonedDateTime utilizzando un oggetto DateTimeFormatter. Cerca Stack Overflow per molte altre discussioni su questo corso.

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

Questo formato standard è vicino a ciò che si vuole, ma ha una T nel mezzo in cui si desidera uno spazio. Quindi sostituire lo SPAZIO per T.

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

Chi java.time

Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi data legacy come java.util.Date, Calendar, & SimpleDateFormat.

Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.

Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.

Dove ottenere le classi java.time?

Joda Time

Update: Il progetto Joda Time è ora in modalità di manutenzione. Il team consiglia la migrazione alle classi java.time.

L'utilizzo della libreria Joda-Time semplifica notevolmente le operazioni di data e ora.

Nota l'uso di un fuso orario. Se omesso, stai lavorando in UTC o nel fuso orario predefinito della JVM.

DateTime now = DateTime.now (DateTimeZone.forID("America/Montreal")) ; 
DateTime weekAgo = now.minusWeeks(1); 
DateTime weekAgoStart = weekAgo.withTimeAtStartOfDay(); 
Problemi correlati