2013-05-07 16 views
5

Ho un piccolo programma che visualizza la settimana corrente a partire dalla data di oggi, in questo modo:Java: ottieni il numero della settimana da qualsiasi data?

GregorianCalendar gc = new GregorianCalendar(); 
    int day = 0; 
    gc.add(Calendar.DATE, day); 

E poi una JLabel che visualizza il numero della settimana:

JLabel week = new JLabel("Week "+gc.get(Calendar.WEEK_OF_YEAR)); 

Così adesso mi piacerebbe avere un JTextField in cui inserire una data e la JLabel si aggiornerà con il numero della settimana di quella data. Non sono sicuro di come farlo, visto che sono abbastanza nuovo in Java. Devo salvare l'input come stringa? Un numero intero? E quale formato dovrebbe essere (aaaaMMgg ecc.)? Se qualcuno potesse aiutarmi, lo apprezzerei!

+0

Bisogna analizzare l'ingresso con un formato specificato. Questo potrebbe aiutare: http://stackoverflow.com/questions/3386520/parse-date-from-string-in-this-format-dd-mm-yyyy-to-dd-mm-yyyy –

+0

FYI, la vecchia data fastidiosa -time classes come ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java.util.Calendar' ] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html) e 'java.text.SimpleTextFormat' sono ora [legacy] (https: //en.wikipedia .org/wiki/Legacy_system), soppiantato dalle classi [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). Vedi [Tutorial di Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

risposta

16

Devo salvare l'input come stringa? Un numero intero?

Quando si utilizza un JTextField, l'ingresso che si ottiene da l'utente è un String, dal momento che la data può contenere caratteri come . o -, a seconda del formato della data che si sceglie. Ovviamente è anche possibile utilizzare metodi di input più sofisticati, in cui il campo di input convalida già il formato della data e restituisce valori separati per giorno, mese e anno, ma utilizzando JTextField è ovviamente più facile iniziare.

E quale formato dovrebbe essere (aaaaMMgg ecc.)?

Questo dipende dalle vostre esigenze. È possibile utilizzare la classe SimpleDateFormat per analizzare qualsiasi formato data:

String input = "20130507"; 
String format = "yyyyMMdd"; 

SimpleDateFormat df = new SimpleDateFormat(format); 
Date date = df.parse(input); 

Calendar cal = Calendar.getInstance(); 
cal.setTime(date); 
int week = cal.get(Calendar.WEEK_OF_YEAR); 

Ma è più probabile che si desidera utilizzare il formato della data specifica al vostro locale:

import java.text.DateFormat; 

DateFormat defaultFormat = DateFormat.getDateInstance(); 
Date date = defaultFormat.parse(input); 

per dare all'utente un suggerimento su quale formato uso, è necessario lanciare il DateFormat ad un SimpleDateFormat per ottenere la stringa modello:

if (defaultFormat instanceof SimpleDateFormat) { 
    SimpleDateFormat sdf = (SimpleDateFormat)defaultFormat; 
    System.out.println("Use date format like: " + sdf.toPattern()); 
} 

il commento di @adenoyelle mi ricorda sopra: Test di unità di scrittura per il codice di analisi della data.

+1

Anni più tardi, questa risposta è obsoleta con miglioramenti a Java. Le fastidiose vecchie lezioni di data-ora come ['java.util.Date'] (https://docs.oracle.com/javase/8/docs/api/java/util/Date.html), [' java. util.Calendar'] (https://docs.oracle.com/javase/8/docs/api/java/util/Calendar.html), e 'java.text.SimpleTextFormat' sono ora [legacy] (https://en.wikipedia.org/wiki/Legacy_system), soppiantato dalle classi [java.time] (https://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) . Vedi [Tutorial di Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

1

È possibile utilizzare ciò, ma è necessario analizzare il valore della data nel formato data appropriato utilizzando SimpleDateFormatter di java API. Puoi specificare qualsiasi formato tu voglia. Dopo di che puoi fare manipolazione per ottenere la settimana dell'anno.

3

È possibile memorizzare la data come stringa e l'utente può inserirla in quasi tutti i formati specificati. Hai solo bisogno di usare un oggetto DateFormat per interpretare la data in cui entrano. Ad esempio, vedere top answer su Convert String to Calendar Object in Java.

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy"); 
cal.setTime(sdf.parse("Mon Mar 14 16:02:37 GMT 2011")); 

Per leggere la data da un JTextField, è possibile sostituire che con qualcosa come:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); // or any other date format 
cal.setTime(sdf.parse(dateTextField.getText())); 

Allora non vi resta che leggere il numero della settimana dal cal nello stesso modo avete dimostrato per la questione . (Questo è un esempio semplificato. Avresti bisogno di gestire il potenziale ParseException gettato dal metodo DateFormatparse.)

0
public static int getWeek() { 
     return Calendar.getInstance().get(Calendar.WEEK_OF_YEAR); 
    } 

Opere fine settimana e cambio in tempo reale corrente

5

Java 1.8 fornisce qualche nuova classi in package java.time:

import java.time.Instant; 
import java.time.ZoneId; 
import java.time.ZonedDateTime; 
import java.time.temporal.IsoFields; 

ZonedDateTime now = ZonedDateTime.ofInstant(Instant.now(), ZoneId.systemDefault()); 
System.out.printf("Week %d%n", now.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)); 

maggior parte dei calendari legacy possono essere facilmente convertiti in java.time.ZonedDateTime/java.time.Instant con metodi di interoperabilità, in vostro particolare caso GregorianCalendar.toZonedDateTime().

3

tl; dr

YearWeek.of(LocalDate.parse("2017-01-23")) 
     .getWeek() // and .getYear() 

ISO 8601 settimana standard

Se si desidera che lo standard ISO 8601 week, piuttosto che una definizione localizzata di una settimana, utilizzare la classe YearWeek trovato nel progetto ThreeTen-Extra che aggiunge funzionalità alle classi java.time integrate in Java 8 e versioni successive.

ISO-8601 definisce la settimana come sempre a partire dal lunedì. La prima settimana è la settimana che contiene il primo giovedì dell'anno solare. Pertanto, l'anno della settimana utilizzato in questa classe non coincide con l'anno solare.

In primo luogo, ottenere la data di oggi. 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.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

Oppure lasciare che l'utente specifichi una data digitando una stringa. L'input della stringa di analisi di una data viene trattato in molte altre domande e risposte. Il modo più semplice è che l'utente utilizzi il formato ISO 8601 standard, YYYY-MM-DD come 2017-01-23.

LocalDate ld = LocalDate.parse("2017-01-23") ; 

Per altri formati, specificare un DateTimeFormatter per l'analisi. Ricerca overflow dello stack per molti molti esempi di utilizzo di quella classe.

DateTimeFormatter f = DateTimeFormatter.ofPattern("d/M/uuuu" , Locale.US) ; 
LocalDate ld = LocalDate.parse("1/23/2017" , f) ; 

Ottenere il YearWeek.

YearWeek yw = YearWeek.of(ld) ; 

per creare una stringa, è possibile utilizzare il standard ISO 8601 format for year-week, aaaa-WWW come 2017-W45. Oppure puoi estrarre ogni numero.

  • YearWeek::getWeek - Ottiene il campo dell'anno della settimana della settimana.
  • YearWeek::getYear - Ottiene il campo relativo alla settimana.

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?

Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval, YearWeek, YearQuarter e more.

0

questo ha funzionato per me

public void sortListItems(List<PostModel> list) { 
    Collections.sort(list, new Comparator<PostModel>() { 
     DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
     @Override 
     public int compare(PostModel o1, PostModel o2) { 
      int ret = 0; 
      try { 
       ret = dateFormat.parse(o1.getDate()).compareTo(dateFormat.parse(o2.getDate())); 
       return ret; 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

      return ret; 
     } 
    }); 
} 
Problemi correlati