2012-02-16 20 views
19

Mamy narzędzie, które będzie działać w dowolnym dniu od poniedziałku do piątku. Zaktualizuje on pewną liczbę plików w narzędziu do zarządzania treścią. Data ostatniej modyfikacji skojarzonej z tym plikiem powinna być datą zeszłego tygodnia. Napisałem następujący program, aby pobrać datę poniedziałku w bieżącym tygodniu. Ale nadal nie jestem pewien, czy to zadziała dla wszystkich scenariuszy. Czy ktoś ma lepsze rozwiązanie?Odzyskaj poniedziałkową datę bieżącego tygodnia

Calendar c = Calendar.getInstance(); 
c.setTime(new Date()); 
System.out.println(c.get(Calendar.DAY_OF_MONTH)); 
System.out.println(c.get(Calendar.DAY_OF_WEEK)); 
int mondayNo = c.get(Calendar.DAY_OF_MONTH)-c.get(Calendar.DAY_OF_WEEK)+2; 
c.set(Calendar.DAY_OF_MONTH,mondayNo); 
System.out.println("Date "+c.getTime()); 
+0

Do tej pory używasz kłopotliwych starych klas daty i godziny, które są już starsze, zastąpione przez klasy java.time. –

Odpowiedz

43

gorąco polecam korzystania Joda Time zamiast (dla wszystkich prac data/czas, a nie tylko tego):

// TODO: Consider time zones, calendars etc 
LocalDate now = new LocalDate(); 
LocalDate monday = now.withDayOfWeek(DateTimeConstants.MONDAY); 
System.out.println(monday); 

Należy zauważyć, że jak już używany poniedziałek tu, który jest pierwszym dniem tygodnia w Joda czas, to zawsze zwróci wcześniejszą dzień (lub tego samego dnia). Jeśli wybierzesz środę (na przykład), to będzie to z wyprzedzeniem do środy od poniedziałku lub wtorku. Zawsze możesz dodać lub odjąć tydzień, jeśli potrzebujesz "następnej środy" lub "poprzedniej środy".

EDIT: Jeśli naprawdę chcesz użyć java.util.Date/Calendar, można użyć:

Calendar c = Calendar.getInstance(); 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
System.out.println("Date " + c.getTime()); 

Można użyć Calendar.setFirstDayOfWeek aby wskazać, czy w tygodniu od poniedziałku do niedzieli do soboty lub niedzielę ; I wierzę, ustawienie dnia tygodnia pozostanie w bieżącym tygodniu - ale przetestuj go.

+1

Czy to nie jest możliwe z tylko api Java? Używamy narzędzia CMS, w którym dodanie nowego słoika wymagałoby zmiany wdrożenia. –

+1

@ShashankKadne: Jest * możliwe *, jasne - ale jest * okropne *. Jeśli wykonasz jakąś znaczącą część pracy opartej na dacie, korzyści wynikające z używania czasu Jody * znacznie * przeważą nad krótkim kosztem. –

+0

@ShashankKadne: Edytowałem swoją odpowiedź za pomocą kodu java.util.Calendar ... ale nadal zalecałbym używanie czasu Joda. –

1

Co na temat korzystania z biblioteki Joda Time ... Weźmy spojrzeć na ten answer ...

+0

Czy to nie jest możliwe z tylko api Java? Używamy narzędzia CMS, w którym dodanie nowego słoika wymagałoby zmiany wdrożenia. –

+0

Spróbuj spojrzeć na czas Joda [źródło] (https://github.com/JodaOrg/joda-time) .. Może mógłbyś znaleźć najlepszy sposób na wdrożenie takiej funkcji z aplikacją Java api ... – PrimosK

-1

To nie będzie działać, jeśli prądy tygodnia poniedziałek to miesiąc przed ... Na przykład, jeśli dzisiaj jest piątek 1 czerwca ... Należy prawdopodobnie raczej użyć metody roll ...

+1

To dało mi Pon 28 maja 14:51:27 GMT + 05: 30 2012 .... i myślę, że to prawda. –

+0

Mój błąd, masz rację, działa ... – pgras

6

Poniższy będzie działać, tym owijania miesiącach:

Calendar c = Calendar.getInstance(); 
c.setFirstDayOfWeek(Calendar.MONDAY); 
c.setTime(new Date()); 
int today = c.get(Calendar.DAY_OF_WEEK); 
c.add(Calendar.DAY_OF_WEEK, -today+Calendar.MONDAY); 
System.out.println("Date "+c.getTime()); 

Jeśli jednak edytować swoją aplikację na niedzielę (. np Niedziela 12 lutego), termin będzie na następny poniedziałek. W zależności od Twoich wymagań (aplikacja będzie działać tylko od poniedziałku do piątku), nie powinno to stanowić problemu.

+0

(+1) za sprawdzenie, czy działa w tym ekstremalnym stanie. Ale pójdę z rozwiązaniem @ Jona, ponieważ jego kod jest mniejszy niż mój. ;) –

2

Jak sugeruje Jon metoda calendar.set działa ... Przetestowałem go zarówno w przypadku poniedziałek w tym samym miesiącu, a w innym miesiącu stosując następujący fragment:

Calendar c = Calendar.getInstance(); 
//ensure the method works within current month 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
System.out.println("Date " + c.getTime()); 
//go to the 1st week of february, in which monday was in january 
c.set(Calendar.DAY_OF_MONTH, 1); 
System.out.println("Date " + c.getTime()); 
//test that setting day_of_week to monday gives a date in january 
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); 
System.out.println("Date " + c.getTime()); 
//same for tuesday 
c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); 
System.out.println("Date " + c.getTime()); 

Te wyniki :

Date Mon Feb 13 10:29:41 CET 2012 
Date Wed Feb 01 10:29:41 CET 2012 
Date Mon Jan 30 10:29:41 CET 2012 
Date Tue Jan 31 10:29:41 CET 2012 
0

w przypadku, gdy nie chcesz używać Joda czasie można zrobić tak, aby znaleźć tygodnie -> (działa na Androidzie)

public static ArrayList<String> getWeeks(int month) { 

ArrayList<String> arrayListValues = new ArrayList<>(); 
SimpleDateFormat sdf = new SimpleDateFormat("MMMM d"); 

Calendar calendar = Calendar.getInstance(); 

calendar.set(Calendar.MONTH, month); 

int day = calendar.get(Calendar.DAY_OF_WEEK); 
while (day != 1) { 
    calendar.add(Calendar.DATE, 1); 
    day = calendar.get(Calendar.DAY_OF_WEEK); 
} 

calendar.add(Calendar.DATE, -14); 
String y1 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 6); 
String y2 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 1); 
arrayListValues.add(y1 + " - " + y2); 

y1 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 6); 
y2 = sdf.format(calendar.getTime()); 
calendar.add(Calendar.DATE, 1); 
arrayListValues.add(y1 + " - " + y2); 



for (int i = 0; i < 10; i++) { 

    y1 = sdf.format(calendar.getTime()); 
    calendar.add(Calendar.DATE, 6); 
    y2 = sdf.format(calendar.getTime()); 
    calendar.add(Calendar.DATE, 1); 
    arrayListValues.add(y1 + " - " + y2); 
} 

return arrayListValues; 
} 
9

tl; dr

LocalDate previousMonday = 
    LocalDate.now(ZoneId.of("America/Montreal")) 
      .with(TemporalAdjusters.previous(DayOfWeek.MONDAY)); 

java.time

Zarówno klasa java.util.Calendar i biblioteki Joda-Time zostały wyparte przez java.time ramach wbudowany w Java 8 i późniejszych. Zobacz Oracle Tutorial. Znaczna część java.funkcja czasu została przeniesiona do Java 6 & 7 w ThreeTen-Backport i dodatkowo przystosowana do systemu Android w wersji ThreeTenABP.

Klasa java.time.LocalDate reprezentuje wartość tylko dla daty bez pory dnia i bez strefy czasowej.

Ustalenie dzisiejszej daty wymaga strefy czasowej: ZoneId.

ZoneId zoneId = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(zoneId); 

TemporalAdjuster interfejs (patrz Tutorial) jest mocny, ale prosty sposób manipulować wartości daty i godziny. Klasa TemporalAdjusters (uwaga w liczbie mnogiej) implementuje bardzo przydatne korekty. Tutaj używamy previous(DayOfWeek).

Przydatne wyliczenie DayOfWeek ułatwia określenie dnia tygodnia.

LocalDate previousMonday = today.with(TemporalAdjusters.previous(DayOfWeek.MONDAY)); 

Jeżeli dzisiaj jest poniedziałek, a chcesz używać dzisiaj raczej niż tydzień temu, zadzwoń previousOrSame.

+0

Najlepsza odpowiedź, gdy Java 8 jest dostępna. – peceps

+1

@peceps Reread pierwszy akapit. Dostępny jako back-port dla Java 6, Java 7 i Android. Więc java.time jest najlepszym podejściem wszędzie tam, gdzie używana jest Java. –

Powiązane problemy