2010-12-27 25 views
9

Ben How to detect if a date is within this or next week in Java? istedi ama cevaplar ı geçmiş Pazar ve önümüzdeki Pazar bulabilirseniz şimdi ben düşünüyorum, kafa karıştırıcı edildi, arada herhangi bir gün bu hafta ve önümüzdeki Pazar ve bundan sonra Pazar arasında herhangi bir gün gelecek hafta , doğrumuyum ?Geçtiğimiz Pazar günü ve gelecek pazar günü Java'ya nasıl geçilir?

Yani benim yeni soru: Nasıl geçmiş Pazar ve Java geliyor Pazar alınır?

+0

Geçerli gün Pazar ise ne olur? –

+0

Bugün pazar ise, 7 günlük haftanın ilk günü, bu sabah başlıyor 00:00 kadar bir sonraki Pazar saat 00:00 bu hafta. – Frank

cevap

12

Nasıl:

Calendar c=Calendar.getInstance(); 
c.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY); 
c.set(Calendar.HOUR_OF_DAY,0); 
c.set(Calendar.MINUTE,0); 
c.set(Calendar.SECOND,0); 
DateFormat df=new SimpleDateFormat("EEE yyyy/MM/dd HH:mm:ss"); 
System.out.println(df.format(c.getTime()));  // This past Sunday [ May include today ] 
c.add(Calendar.DATE,7); 
System.out.println(df.format(c.getTime()));  // Next Sunday 
c.add(Calendar.DATE,7); 
System.out.println(df.format(c.getTime()));  // Sunday after next 

sonucu:

Sun 2010/12/26 00:00:00 
Sun 2011/01/02 00:00:00 
Sun 2011/01/09 00:00:00 

ilk ikisi arasındaki herhangi bir günde bu hafta, son ikisi arasındaki her şey gelecek hafta.

+1

En iyi cevap değil. Java.util.Date ve .Calendar sınıfları o kadar kötü ki, Sun/Oracle bile onlardan vazgeçti. Yeni [java.time paketi] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html) artık eski sınıfları desteklemek için Java 8'de paketlenmiştir. [Joda-Time] (http://www.joda.org/joda-time/) java.time'dan ilham aldı ve bazı üstün özelliklere sahip. –

+3

Java 8'i kullanamıyorsanız, bu çözüm güzeldir! Android'de, Java 6 API ile sınırlıyız! – nat101

+0

Bir Java 8 çözümü arayanlar için, aşağıda bir cevap yayınladım. –

0

http://download.oracle.com/javase/1.4.2/docs/api/java/util/Date.html

Ben Calendar.get (Calendar.DAY_OF_WEEK) Sen aktüel yıl içinde haftanın sayısal gösterimini verir Calendar.WEEK_OF_YEAR alanında, çalışmak için deneyebilirsiniz

+3

Java'nın yerleşik Tarih öğelerini kullanmadan önce pencereden dışarı atlamanızı tavsiye ederim ...;) –

0

öneriyoruz. Bugün Pazar ise daha iyi bir zaman/tarih paketini kullanmadan

@Test 
public void testThisAndNextWeek() throws Exception { 
    GregorianCalendar lastWeekCal = new GregorianCalendar(2010, 
      Calendar.DECEMBER, 26); 
    int lastWeek = lastWeekCal.get(Calendar.WEEK_OF_YEAR); 

    GregorianCalendar nextWeekCal = new GregorianCalendar(2011, 
      Calendar.JANUARY, 4); 
    int nextWeek = nextWeekCal.get(Calendar.WEEK_OF_YEAR); 

    GregorianCalendar todayCal = new GregorianCalendar(2010, 
      Calendar.DECEMBER, 27); 
    int currentWeek = todayCal.get(Calendar.WEEK_OF_YEAR); 

    assertTrue(lastWeekCal.before(todayCal)); 
    assertTrue(nextWeekCal.after(todayCal)); 
    assertEquals(51, lastWeek); 
    assertEquals(52, currentWeek); 
    // New Year.. so it's 1 
    assertEquals(1, nextWeek); 
} 
4

...

DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); 
Calendar now = new GregorianCalendar(); 
Calendar start = new GregorianCalendar(now.get(Calendar.YEAR), 
     now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH)); 

while (start.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) { 
    start.add(Calendar.DAY_OF_WEEK, -1); 
} 

Calendar end = (Calendar) start.clone(); 
end.add(Calendar.DAY_OF_MONTH, 7); 

System.out.println(df.format(now.getTime())); 
System.out.println(df.format(start.getTime())); 
System.out.println(df.format(end.getTime())); 

, bu süre başlangıcı olarak kabul edilir. (Bu sorunuzun gelen sesler gibi) bu hafta ve önümüzdeki hafta bir süreyi isterseniz, end.add (...) doğrultusunda 14 yerine 7 yerine kullanabilirsiniz. Saatler, başlangıç ​​ve bitiş arasında kalan başka bir nesnenin karşılaştırması için gece yarısına ayarlanır. Bu konuda

4

Birincisi, Java dan Tarih/Saat paketini kullanmayın. Joda-Time adlı çok daha iyi bir hizmet paketi var - bunu indirin ve kullanın. zaman hiç bir hafta, bu hafta ise geçen haftaya veya eğer

belirlemek için bunu:

  1. iki Aralığı nesneleri oluşturma - bu hafta
  2. Kullanım için geçen hafta diğeri aradığınız tarihi hangi aralıkta tuttuğunu belirlemek için (uzun) yöntem içerir. geri geri haftaya ikisini oluşturabilir birkaç serin yolu vardır

bulunmaktadır. Bir haftalık bir Süre oluşturabilir, ilk hafta için başlangıç ​​zamanını bulabilir ve yalnızca o başlangıç ​​saatine göre iki Aralık oluşturabilirsin. Sizin için işe yarayan başka bir yol bulmakta çekinmeyin - paketin istediğine ulaşmak için birçok yolu vardır.


DÜZENLEME: Geçenlerde bu kullanımını çözmek için tasarlanmıştır Lamma Date geliştirilen

// Get the date today, and then select midnight of the first day of the week 
// Joda uses ISO weeks, so all weeks start on Monday. 
// If you want to change the time zone, pass a DateTimeZone to the method toDateTimeAtStartOfDay() 
DateTime midnightToday = new LocalDate().toDateTimeAtStartOfDay(); 
DateTime midnightMonday = midnightToday.withDayOfWeek(DateTimeConstants.MONDAY); 

// If your week starts on Sunday, you need to subtract one. Adjust accordingly. 
DateTime midnightSunday = midnightMonday.plusDays(-1); 

DateTime midnightNextSunday = midnightSunday.plusDays(7); 
DateTime midnightSundayAfter = midnightNextSunday.plusDays(7); 

Interval thisWeek = new Interval(midnightSunday, midnightNextSunday); 
Interval nextWeek = new Interval(midnightNextSunday, midnightSundayAfter); 

if (thisWeek.contains(someDate.getTime())) System.out.println("This week"); 
if (nextWeek.contains(someDate.getTime())) System.out.println("Next week"); 
+1

Joda zamanı seviyorum, ama belki bu bir kod örneği ile daha iyi olurdu? ;) – crockpotveggies

+0

Haklısın, tam olarak bunu yapmalıydım. Düzenlenen. –

1

:

Joda-Time burada downloaded here olabilir ve Joda bunu nasıl kullanıldığını açıklayan bir örnektir durumda:

Date today = new Date(2014, 7, 1);  // assume today is 2014-07-01 
Date previousSunday = today.previousOrSame(DayOfWeek.SUNDAY); // 2014-06-29 
Date nextSunday = today.next(DayOfWeek.SUNDAY);     // 2014-07-06 
12

P için bir Java 8 çözümü ekleyebilirim. osterity.

final LocalDate today = LocalDate.of(2015, 11, 20); 
final LocalDate nextSunday = today.with(next(SUNDAY)); 
final LocalDate thisPastSunday = today.with(previous(SUNDAY)); 

Bu yaklaşım ayrıca ZonedDateTime gibi diğer geçici sınıflar için de çalışır. Yazılı olarak, aşağıdaki statik ithalatı varsayar:

+0

Harika çözüm, Teşekkürler – KZoNE

İlgili konular