Ich arbeite an einem Projekt. Dort sollte ich die gesamten Wochen eines Jahres finden. Ich habe es mit dem folgenden Code versucht, aber ich bekomme die falsche Antwort: 2020 hat 53 Wochen, aber dieser Code gibt 52 Wochen.
Wo bin ich in diesem Code falsch gelaufen?
package com.hib.mapping;
import java.time.LocalDate;
import java.time.temporal.WeekFields;
import java.util.Calendar;
import java.util.GregorianCalendar;
import org.joda.time.DateTime;
public class TestWeek {
public static void main(String args[]) {
System.out.println(getWeeks());
}
public static int getWeeks() {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2020);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
GregorianCalendar gregorianCalendar = new GregorianCalendar();
int weekDay = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (gregorianCalendar.isLeapYear(2020)) {
if (weekDay == Calendar.THURSDAY || weekDay == Calendar.WEDNESDAY)
return 53;
else
return 52;
} else {
if (weekDay == Calendar.THURSDAY)
return 53;
else
return 52;
}
}
}
Ausgabe:
52
java
date
java-8
week-number
Kumaresan Perumal
quelle
quelle
Date
undCalendar
. Verwenden Siejava.time
stattdessen, es ist viel besser und einfacher.Antworten:
Mit Hilfe der Wikipedia - Definition hier . Ein Jahr hat 53 Wochen, wenn der 1. Januar ein Donnerstag ist oder der 31. Dezember ein Donnerstag, andernfalls 52 Wochen. Diese Definition entspricht der von Ihnen verwendeten. Ich denke, dies ist eine viel einfachere Bedingung, da Sie nicht nach Schaltjahren suchen müssen.
Verwenden von Java 8
java.time
APIs:quelle
tl; dr
Verwenden Sie für eine Standardwoche nach ISO 8601 die
YearWeek
Klasse aus der ThreeTen-Extra- Bibliothek mit einer ternären Anweisung.Das ist,
YearWeek.of( 2020 , 1 ).is53WeekYear() ? 53 : 52
Definieren Sie "Woche"
Sie müssen eine Woche definieren. In Ihrem Codebeispiel hängt die Definition der Woche von der aktuellen Standardeinstellung der JVM ab
Locale
. Daher können Ihre Ergebnisse zur Laufzeit variieren.Ihr Code verwendet auch schreckliche Datums- und Uhrzeitklassen , die vor Jahren durch die modernen java.time- Klassen ersetzt wurden. Verwenden Sie
GregorianCalendar
& nicht mehrCalendar
. Sie wurden aus guten Gründen ersetzt.ISO 8601 Woche
Die ISO 8601 - Standard definiert eine Woche als:
Diese Definition bedeutet:
Wenn Ihre Definition abweicht, lesen Sie die Antwort von Ole VV .
YearWeek:is53WeekYear
Wenn dies Ihrer Definition entspricht, fügen Sie Ihrem Projekt die ThreeTen-Extra- Bibliothek hinzu, um die in Java 8 und höher integrierte java.time- Funktionalität zu erweitern . Sie haben dann Zugriff auf die
YearWeek
Klasse.Um nach einem bestimmten wochenbasierten Jahr zu fragen, wählen Sie einfach eine beliebige Woche des Jahres willkürlich aus. Zum Beispiel fragen wir für das wochenbasierte Jahr 2020 nach Woche 1.
Beachten Sie, wie der erste Tag des wochenbasierten Jahres 2020 aus dem Kalenderjahr 2019 stammt.
quelle
now
. Da Sie die Wochenzahl für ein bestimmtes Jahr anstelle des aktuellen Jahres erhalten möchten, verwenden Sie einfachYearWeek.of(yourYear, 1)
.Asia/Kolkata
, derzeit mit einem Versatz von +05: 30. Im Java-Code :ZoneId.of( "Asia/Kolkata" )
. Weitere Informationen und Geschichte finden Sie in Wikipedia, Zeit in Indien .Die flexible Lösung
Dies sollte für jedes Wochennummerierungsschema funktionieren, das in einem
WeekFields
Objekt dargestellt werden kann.Die Idee ist, die Wochennummer der letzten Woche des wochenbasierten Jahres zu ermitteln. Ich versuche es zuerst mit dem 31. Dezember, aber das kann in der ersten Woche des folgenden Jahres sein. Wenn ja, gehe ich eine Woche zurück.
Ich habe ziemlich gründlich getestet
WeekFields.ISO
, nicht so sehr mit anderenWeekFields
Objekten, aber wie gesagt, ich glaube, es funktioniert.Wenn Sie sicher sind, dass Sie immer ISO 8601 Wochen benötigen , sollten Sie sich für eine der guten Antworten von Sweeper und Basil Bourque entscheiden . Ich habe dies veröffentlicht, falls Sie eine flexiblere Lösung benötigen, die auch mit anderen Wochennummerierungsschemata funktioniert.
Verwenden Sie java.time
Der Code in Ihrer Frage ist insofern lustig, als er Klassen sowohl aus Joda-Time als auch aus java.time importiert, jedoch die alte
Calendar
undGregorianCalendar
Java 1.1 verwendet. Diese Klassen waren schlecht gestaltet und mittlerweile längst veraltet. Sie sollten sie nicht verwenden. Joda-Time befindet sich im Wartungsmodus, danach hat java.time übernommen. Welches ist, was ich benutze und empfehle, dass Sie verwenden.quelle
Ich denke, das sollte auch gut funktionieren:
quelle
Nachdem ich viel in Java 8 versucht hatte, konnte ich keine Lösung finden. dann habe ich Joda Datums- und Zeitabhängigkeit vorbereitet. Es gab mir eine gute Antwort, wie ich erwartet hatte
Code:
Maven-Abhängigkeit:
quelle