2015-09-28 24 views
7

yılı ve haftanın dayalı alın İki tamsayı var. Ben tarih belli bir yılda özellikle haftanın ilk gününü temsil bu iki değerin, bir LocalDateTime inşa etmek istiyoruz. Yılın ilk günü hep o yılın ilk haftasının başlangıcı olmadığındanLocalDateTime yılın

LocalDateTime ldt = LocalDateTime.of(year, 1, 1, 0, 0).plusWeeks(week-1); 

Bu, doğru sonucu vermez:

Zaten bu çalıştı. İlk haftanın ilk gününü nasıl alacağımı anlayamıyorum.

Java 8 Tarih ve Saat API ile bunu yapmak için herhangi bir basit yolu var mı?

Not: Ben de here verilen cevaplardan oluşan bir geçici çözüm oluşturabilir biliyorum, ama bu zoraki görünüyor. Belki öyle değil, eğer öyleyse, bana bildirin!

+0

Hafta numaralandırma yerele özgü, yani o iki veri noktası size kesin bir tarih vermez. AFAIK 'LocalDateTime' bu gerçeği ele almaz ama' GregorianCalendar' yapar. – biziclop

+0

@biziclop Bence tam istediği bu. Yerele özgü bir hafta "1" - bazı çocuklar için ilk 4 günlük hafta, diğerleri için başka bir şey. – dognose

+0

@dognose Sonra 'GregorianCalendar' gerçekten gitmek için yoldur. – biziclop

cevap

9

aşağıdaki kod LocalDateTime alacak ve ilk verilen yıl için verilen haftalık-of-the yılın güne ayarlayın: Haftada-of-the yılın kavramı yerel olduğunu

int week = 1; 
int year = 2016; 
WeekFields weekFields = WeekFields.of(Locale.getDefault()); 
LocalDateTime ldt = LocalDateTime.now() 
          .withYear(year) 
          .with(weekFields.weekOfYear(), week) 
          .with(weekFields.dayOfWeek(), 1); 
System.out.println(ldt); 

Not özel. Burada, varsayılan Yerel Ayarı kullandım, ancak kullanıcı tarafından sağlanan bir yerel ayarı kullanmanız gerekebilir.

Zaman parçası kurtulmak istiyorsanız

, sen truncatedTo(ChronoUnit.DAYS) bir çağrı ekleyebilir.

3

Sen ilgilenen günün dize temsilini ayrıştırmak deneyebilirsiniz: Bir LocalDateTime gerekiyorsa

private static final DateTimeFormatter YEAR_WEEK = DateTimeFormatter.ofPattern("YYYY-w-e", Locale.getDefault()); 

public static LocalDate fromYearWeek(int year, int week) { 
    return LocalDate.parse(year + "-" + week + "-1", YEAR_WEEK); 
} 

, daha sonra örneğin localDate.atTime(...) veya localDate.atStartOfDay() kullanabilirsiniz.

2
LocalDate ld = LocalDate.parse("2012-W48-1", DateTimeFormatter.ISO_WEEK_DATE); 
+0

Bu cevap için teşekkürler! Ben assylias'ın cevabına çok benzediğini ve biraz da eksik olduğunu düşünüyorum. Belki neden farklı olduğunu açıklamak için düzenleyebilirsiniz. – bashoogzaad

+0

benzer, ancak fazla LocalDate örneği oluşturulmasından kaçının – Vovka

1

ThreeTen-Ekstra

ThreeTen-Extra proje ek sınıfları ile java.time uzanır. Bu proje java.time için gelecekteki olası eklemeler için kanıtlanmış bir zemin. YearWeek gibi bazı yararlı sınıflar bulabilirsiniz.

“Hafta” tarafından kastedilen, standart 1.kastedilirse, 1. yılın haftanın ilk Perşembe günü olduğu yerde, YearWeek sınıfının sizin için çalışmasını sağlayın.

int weekBasedYear = 2015; // Not the calendar year! 
int weekOfYear = 1; 
YearWeek yearWeek = YearWeek.of (weekBasedYear , weekOfYear); 

Bir LocalDate nesne temsil tarih salt değeri elde edebilirsiniz. gün haftanın-Pazartesi haftanın ilk günüdür DayOfWeek enum kullanarak istiyorum ve Pazar son gün belirtin. Bir ISO haftasının her zaman Pazartesi günü başlayacağını ve her zaman Pazar günü bittiğini unutmayın.

LocalDate mondayOfYearWeek = yearWeek.atDay (DayOfWeek.MONDAY); 
LocalDate sundayOfYearWeek = yearWeek.atDay (DayOfWeek.SUNDAY); 

Dökümü konsola. Haftanın bir önceki takvim yılında (2014) nasıl başladığını ve 2015'te sona erdiğini unutmayın, çünkü 1 Ocak 2015 Perşembe olup, bu nedenle ISO Hafta # 1'e işaret eder. Aşağıdaki Pazar, 4 Ocak 2015, ISO Hafta # 1'i tamamlar.

System.out.println ("yearWeek: " + yearWeek + " starts on mondayOfYearWeek: " + mondayOfYearWeek + " and ends on sundayOfYearWeek: " + sundayOfYearWeek); 

yılHafta: 2015-W01 mondayOfYearWeek başlar: 2014-12-29 ve sundayOfYearWeek sona eriyor: bir yıl içinde 2015-01-04

+1

bu iyidir, ancak sorun başka bir bağımlılık kullanıyor. Ben böyle bir sezgisel API jdk kendisi eklenir olsun isterdim. –

İlgili konular