Réponse courte
API et widget de semaine
Points d’accès JSON documentés et widget ISO sans traçage.
Réponse courte
L’API valide les paramètres et renvoie des codes d’erreur stables ; le widget n’utilise aucune police externe.
Méthode
CORS est restrictif par défaut et le contrat complet est disponible au format OpenAPI.
JavaScript : une date sans décalage de fuseau
La recette complète accepte YYYY-MM-DD de 1900 à 2100, rejette les jours impossibles et calcule en UTC. Pour un horodatage, déterminez d’abord la date dans le fuseau IANA voulu. 2027-01-01 donne { isoYear: 2026, isoWeek: 53, isoWeekday: 5 }.
Exécution : Node.js 24.19.0, Python 3.14.3, SQLite 3.53.3. Les recettes affichées sont comparées au moteur du site pour les 73 414 dates de 1900 à 2100 et huit entrées invalides.
function isoWeekDate(value) {
if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value))
throw new RangeError("Use a date in YYYY-MM-DD format");
const [year, month, day] = value.split("-").map(Number);
if (year < 1900 || year > 2100) throw new RangeError("Supported years: 1900–2100");
const date = new Date(Date.UTC(year, month - 1, day));
if (date.toISOString().slice(0, 10) !== value) throw new RangeError("Invalid date");
const isoWeekday = date.getUTCDay() || 7;
date.setUTCDate(date.getUTCDate() + 4 - isoWeekday);
const isoYear = date.getUTCFullYear();
const isoWeek = Math.ceil(((date.getTime() - Date.UTC(isoYear, 0, 1)) / 86400000 + 1) / 7);
return { isoYear, isoWeek, isoWeekday };
}
isoWeekDate("2027-01-01");Python: date.isocalendar()
Python date.isocalendar() renvoie ensemble année ISO, semaine et jour ISO. La recette contrôle aussi le format et la plage d’années. Fournissez une date, pas un horodatage.
from datetime import date
def iso_week_date(value):
day = date.fromisoformat(value)
if day.isoformat() != value or not 1900 <= day.year <= 2100:
raise ValueError("Use YYYY-MM-DD, years 1900–2100")
year, week, weekday = day.isocalendar()
return {"isoYear": year, "isoWeek": week, "isoWeekday": weekday}
print(iso_week_date("2027-01-01"))SQLite: %G / %V / %u
SQLite : liez :date comme paramètre texte, sans concaténation SQL. Associez %G et %V ; %Y et %W ne sont pas équivalents. WHERE rejette les dates invalides ou non normalisées. Les anciennes versions sans %G/%V ne conviennent pas.
SELECT CAST(strftime('%G', :date) AS INTEGER) AS isoYear,
CAST(strftime('%V', :date) AS INTEGER) AS isoWeek,
CAST(strftime('%u', :date) AS INTEGER) AS isoWeekday
WHERE length(:date) = 10
AND :date GLOB '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]'
AND substr(:date, 1, 4) BETWEEN '1900' AND '2100'
AND date(:date, '+0 days') = :date;Des recettes distinctes selon le dialecte SQL
Ces trois exemples reposent sur les fonctions documentées des éditeurs, sans exécution locale dans PostgreSQL, MySQL ou SQL Server. Résultat attendu pour 2027-01-01 : année ISO 2026, semaine 53. Testez votre version et fixez le fuseau métier des horodatages.
PostgreSQL: ISOYEAR + WEEK
SELECT EXTRACT(ISOYEAR FROM d)::int AS iso_year,
EXTRACT(WEEK FROM d)::int AS iso_week
FROM (VALUES (DATE '2027-01-01')) AS dates(d);MySQL: YEARWEEK(date, 3)
SELECT YEARWEEK('2027-01-01', 3) DIV 100 AS iso_year,
MOD(YEARWEEK('2027-01-01', 3), 100) AS iso_week;SQL Server: iso_week
DECLARE @d date = DATEFROMPARTS(2027, 1, 1);
SELECT CASE
WHEN MONTH(@d) = 1 AND DATEPART(iso_week, @d) >= 52 THEN YEAR(@d) - 1
WHEN MONTH(@d) = 12 AND DATEPART(iso_week, @d) = 1 THEN YEAR(@d) + 1
ELSE YEAR(@d)
END AS iso_year,
DATEPART(iso_week, @d) AS iso_week;