2017-11-13 120 views
8

Bir takvimdeki tarihi görüntülemek için tarihe, haftanın gününe ve haftanın gün numarasına göre hesaplanacak bir yöntemim var.Beklenmedik tarih hesaplama sonucu

Artık tarihleri ​​2017'den itibaren hesapladığımda her şey çalışıyor. Ocak 2018 den tarihleri ​​hesaplarken Ama 2018-01-02 sonuçlanır

import java.time.temporal.IsoFields; 
import java.time.temporal.ChronoField; 
import java.time.LocalDate; 

// ..... 

LocalDate desiredDate = LocalDate.now() 
        .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, 1) 
        .with(ChronoField.DAY_OF_WEEK, 1) 
        .withYear(2018); 

gibi 2017

Kodum görünüyor yılın tarihleri ​​alır ve 2018-01-01 olmalıdır. Bu nasıl mümkün olabilir?

+0

Belki haftanınGünü endeksi diyor ChronoFIeld ait Javadoc AÇIK 0 –

+0

başlar önce

.withYear(year) çağrılabilir: Pazartesi (1) - Pazar (7) – JimmyD

+0

@SayanSil a) öyle değildir, ve b) bu, '2018-01-02' – eis

cevap

12

Çağrılan yöntemlerin sırası önemli görünüyor.

long weekNumber = 1; 
long dayOfWeek = 1; 
int year = 2018; 

LocalDate desiredDate = LocalDate.now() 
    .withYear(year) 
    .with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber) 
    .with(ChronoField.DAY_OF_WEEK, dayOfWeek); 

System.out.println(desiredDate); 

2018-01-01

Not:
Size zaman parçalı yapı (yıl, haftanın ve haftanın günü hafta) inen onları çağırmak, doğru sonuç almak cari yıla göre hafta numarası (1 to 53) ayarlar

.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber) 

: sorun kökenli geldiğini.
Java LocalDate API'si, bu değeri,örneğiyle değiştirmezse, hafta numarası bilgileri LocalDate örneğinde saklanmadığından, bu değeri değiştiremez.

Sen gerçekten LocalDate örnekleri sadece 3 alana göre tanımlandığını LocalDate uygulamasında görebilirsiniz: year, month ve day.

public final class LocalDate 
     implements Temporal, TemporalAdjuster, ChronoLocalDate, Serializable { 
    ... 
    private final int year; 
    /** 
    * The month-of-year. 
    */ 
    private final short month; 
    /** 
    * The day-of-month. 
    */ 
    private final short day; 
    ... 
} 

Yani hassas olmak, önemli olan şudur:

.with(IsoFields.WEEK_OF_WEEK_BASED_YEAR, weekNumber); 
+0

Tnx. – JimmyD

+2

anlamlıdır - önceki sonuca göre yöntemler aynı anda değerlendirilmez. Ama bunun yüzünden sürpriz bir şekilde yakalanmış birini anlayabilirim. – eis

+1

@davidxxx orijinal versiyonunu 2017 yılının ilk pazartesi günü (Ocak 2) ayarlıyor, ardından yılı değiştiriyor. – assylias