2016-06-23 19 views
6

Haftanın Salı günü başlamasını istiyorum ve gün saat 05: 30'da başlamalıyım. Burada zamansal ayarlayıcıları kullanmak için cazipJava8 java.time: Haftanın gününü ve günün başlama saatini nasıl değiştirebilirim?

// LocalDateTimes created with the "standard" ISO time 
LocalDateTime tuesday_4_30 = LocalDateTime.now() 
           .with(TemporalAdjusters.next(DayOfWeek.TUESDAY)) 
           .withHour(4).withMinute(30); 

LocalDateTime tuesday_6_30 = tuesday_4_30.withHour(6).withMinute(30); 
LocalDateTime previous_monday = tuesday_4_30.minusDays(1); 

// eventual adjustment using TemporalAdjusters here? like this? 
// tuesday_4_30 = tuesday_4_30.with(new MyTemporalAdjuster(DayOfWeek.TUESDAY, 5, 30)); 
// <do the same for 6_30 and previous monday> 
// or possibly change some global parameter like Chronology, Locale, or such.. 

Assert.assertEquals(tuesday_4_30.getDayOfWeek(), DayOfWeek.MONDAY); 

Assert.assertEquals(tuesday_6_30.getDayOfWeek(), DayOfWeek.TUESDAY); 

// there is 1 week between the previous monday and the next tuesday 6:30 
Assert.assertEquals(ChronoUnit.WEEKS.between(previous_monday,tuesday_6_30), 1); 

// there is 0 week between the previous monday and the next tuesday 4:30 
Assert.assertEquals(ChronoUnit.WEEKS.between(previous_monday,tuesday_4_30), 0); 

// 1 day between tuesday_4_30 and tuesday_6_30 
Assert.assertEquals(ChronoUnit.DAYS.between(tuesday_4_30,tuesday_6_30), 1); 

// 0 day between previous_monday and tuesday_4_30 
Assert.assertEquals(ChronoUnit.DAYS.between(previous_monday,tuesday_4_30), 1); 

ve ben gün 5 başlar böylece saat ve dakikayı biraz hafifletebilir eminim:

Bunun anlamı

böyle kod çalışması gerekir: 30, ama haftanın başlangıcını nasıl değiştireceğimi anlayamıyorum.

WeekFields numaralı telefona baktığımı ancak ChronoUnit.XXX.between() numaralı telefonu arayarak çalışamayacağımı unutmayın. Bu nedenle fazla ileri gitmedim. Görünüşe göre, çok fazla gerilmiş gibi görünen kendi Kronolojimi kodlamalıyım.

Yardımcı olabilir misiniz?

cevap

3

Not: ChronoUnit.WEEKS.between, iki tarih arasındaki tüm hafta sayısını (7 günlük bir süre) sayar. Sizin durumunuzda, Pazartesi ile Salı günleri arasında sadece bir gün var, bu yüzden 0 dönecektir. Muhtemelen yılların alanlarını karşılaştırmak gerekiyordu.

kendi kronoloji (yani bir ağrı olacak) tarafından, yapabilirsin "sahte" takviminizi yazmak istemiyorsan: temsilen 30: ileri geri UTC UTC arasında + 5 dönüştürme

  • senin kesme zamanı/veya sadece

kodunuzdaki dayalı kaba bir örnek aşağıda bulabilirsiniz hafta hesaplamalar için bazı basit mantık ekleyerek tarihleri ​​

  • den 5:30 çıkarma, hepsi testler geçmektedir yapar - Eğer mantığı ayrı bir sınıfa çıkarmak isteyebilir. Bu biraz hacky ama kullanım durumunuz için yeterli olabilir.

    @Test 
    public void test() { 
        LocalDateTime tuesday_4_30 = LocalDateTime.now() 
              .with(TemporalAdjusters.next(DayOfWeek.TUESDAY)) 
              .withHour(4).withMinute(30); 
    
        LocalDateTime tuesday_6_30 = tuesday_4_30.withHour(6).withMinute(30); 
        LocalDateTime previous_monday = tuesday_4_30.minusDays(1); 
    
        // eventual adjustment using TemporalAdjusters here? like this? 
        // tuesday_4_30 = tuesday_4_30.with(new MyTemporalAdjuster(DayOfWeek.TUESDAY, 5, 30)); 
        // <do the same for 6_30 and previous monday> 
        // or possibly change some global parameter like Chronology, Locale, or such.. 
        assertEquals(dayOfWeek(tuesday_4_30), DayOfWeek.MONDAY); 
    
        assertEquals(dayOfWeek(tuesday_6_30), DayOfWeek.TUESDAY); 
    
        // there is 1 week between the previous monday and the next tuesday 6:30 
        assertEquals(weekBetween(previous_monday, tuesday_6_30), 1); 
    
        // there is 0 week between the previous monday and the next tuesday 4:30 
        assertEquals(weekBetween(previous_monday, tuesday_4_30), 0); 
    
        // 1 day between tuesday_4_30 and tuesday_6_30 
        assertEquals(weekBetween(tuesday_4_30, tuesday_6_30), 1); 
    
        // 0 day between previous_monday and tuesday_4_30 
        assertEquals(weekBetween(previous_monday, tuesday_4_30), 0); 
    } 
    
    private static DayOfWeek dayOfWeek(LocalDateTime date) { 
        return date.atOffset(ZoneOffset.ofHoursMinutes(5, 30)).withOffsetSameInstant(UTC).getDayOfWeek(); 
    } 
    private static int weekBetween(LocalDateTime date1, LocalDateTime date2) { 
        OffsetDateTime date1UTC = date1.atOffset(ZoneOffset.ofHoursMinutes(5, 30)).withOffsetSameInstant(UTC); 
        OffsetDateTime date2UTC = date2.atOffset(ZoneOffset.ofHoursMinutes(5, 30)).withOffsetSameInstant(UTC); 
        int w1 = date1UTC.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); 
        if (dayOfWeek(date1).getValue() >= TUESDAY.getValue()) w1++; 
    
        int w2 = date2UTC.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); 
        if (dayOfWeek(date2).getValue() >= TUESDAY.getValue()) w2++; 
    
        return w2 - w1; 
    } 
    

    Alternatif uygulama, belki temizleyici:

    private static DayOfWeek dayOfWeek(LocalDateTime date) { 
        return adjust(date).getDayOfWeek(); 
    } 
    
    private static int weekBetween(LocalDateTime date1, LocalDateTime date2) { 
        int w1 = adjust(date1).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); 
        if (dayOfWeek(date1).getValue() >= TUESDAY.getValue()) w1++; 
    
        int w2 = adjust(date2).get(IsoFields.WEEK_OF_WEEK_BASED_YEAR); 
        if (dayOfWeek(date2).getValue() >= TUESDAY.getValue()) w2++; 
    
        return w2 - w1; 
    } 
    
    private static LocalDateTime adjust(LocalDateTime date) { 
        return date.minusHours(5).minusMinutes(30); 
    } 
    
  • +0

    Peki günler arasında? Kodunuz çalışıyor çünkü benim durumum her ikisi için de geçerli. Ama sanırım "haftalar arası" ile aynı "günlerde" ara vermek zorundayım. – Gui13

    +0

    Evet, tüm bu yöntemleri yeniden kullanmanız gerekir. Daha iyi bir yol olabilir. – assylias

    İlgili konular