significa que pascua para los domingo cuando celebra catolicos calcular algoritmo datetime language-agnostic calendar computus

datetime - que - Función para devolver la fecha de Pascua para el año dado.



dia de pascua 2018 (5)

Entonces, aquí hay un pequeño desafío de programación divertido. Estaba escribiendo un método rápido para determinar todas las vacaciones de mercado para un año en particular, y luego comencé a leer sobre Pascua y descubrí lo loca que es la lógica para determinar su fecha: el primer domingo después de la luna llena pascual después de la primavera. ¡equinoccio! ¿Alguien sabe de una función existente para calcular la fecha de Pascua para un año determinado?

Por supuesto, probablemente no sea tan difícil de hacer; Pensé que preguntaría en caso de que alguien ya haya hecho esto. (Y eso parece muy probable.)

ACTUALIZACIÓN : En realidad, estoy buscando la fecha del Viernes Santo (el viernes anterior a la Pascua) ... Pensé que la Pascua me llevaría allí. ¿Y ya que estoy en los Estados Unidos, asumo que estoy buscando la Pascua católica? Pero tal vez alguien me pueda corregir si me equivoco.

* Por "loco" quise decir, como, involucrado . No es nada ofensivo ...


Cuando me tocó escribir esto (predicción de tráfico según el día de la semana y las vacaciones), dejé de intentar escribirlo por mi cuenta. Lo encontré en algún lugar de la red. El código era de dominio público, pero ...

suspiro

ver por ti mismo.

void dateOfEaster(struct tm* p) { int Y = p->tm_year; int a = Y % 19; int b = Y / 100; int c = Y % 100; int d = b / 4; int e = b % 4; int f = (b + 8) / 25; int g = (b - f + 1) / 3; int h = (19 * a + b - d - g + 15) % 30; int i = c / 4; int k = c % 4; int L = (32 + 2 * e + 2 * i - h - k) % 7; int m = (a + 11 * h + 22 * L) / 451; p->tm_mon = ((h + L - 7 * m + 114) / 31 ) - 1; p->tm_mday = ((h + L - 7 * m + 114) % 31) + 1; p->tm_hour = 12; const time_t tmp = mktime(p); *p = *localtime(&tmp); //recover yday from mon+mday }

Es mejor dejar algunas preguntas sin contestar.

Me siento afortunado de que todos los días festivos en movimiento en mi país sean un desplazamiento fijo desde la fecha de Pascua.


El siguiente código determina la Pascua a través de powershell:

function Get-DateOfEaster { param( [Parameter(ValueFromPipeline)] $theYear=(Get-Date).Year ) if($theYear -lt 1583) { return $null } else { # Step 1: Divide the theYear by 19 and store the # remainder in variable A. Example: If the theYear # is 2000, then A is initialized to 5. $a = $theYear % 19 # Step 2: Divide the theYear by 100. Store the integer # result in B and the remainder in C. $c = $theYear % 100 $b = ($theYear -$c) / 100 # Step 3: Divide B (calculated above). Store the # integer result in D and the remainder in E. $e = $b % 4 $d = ($b - $e) / 4 # Step 4: Divide (b+8)/25 and store the integer # portion of the result in F. $f = [math]::floor(($b + 8) / 25) # Step 5: Divide (b-f+1)/3 and store the integer # portion of the result in G. $g = [math]::floor(($b - $f + 1) / 3) # Step 6: Divide (19a+b-d-g+15)/30 and store the # remainder of the result in H. $h = (19 * $a + $b - $d - $g + 15) % 30 # Step 7: Divide C by 4. Store the integer result # in I and the remainder in K. $k = $c % 4 $i = ($c - $k) / 4 # Step 8: Divide (32+2e+2i-h-k) by 7. Store the # remainder of the result in L. $l = (32 + 2 * $e + 2 * $i - $h - $k) % 7 # Step 9: Divide (a + 11h + 22l) by 451 and # store the integer portion of the result in M. $m = [math]::floor(($a + 11 * $h + 22 * $l) / 451) # Step 10: Divide (h + l - 7m + 114) by 31. Store # the integer portion of the result in N and the # remainder in P. $p = ($h + $l - 7 * $m + 114) % 31 $n = (($h + $l - 7 * $m + 114) - $p) / 31 # At this point p+1 is the day on which Easter falls. # n is 3 for March and 4 for April. $DateTime = New-Object DateTime $theyear, $n, ($p+1), 0, 0, 0, ([DateTimeKind]::Utc) return $DateTime } } $eastersunday=Get-DateOfEaster 2015 Write-Host $eastersunday


La siguiente función de SQL Server es más general que la respuesta aceptada.

La respuesta aceptada solo es correcta para el rango (inclusive): 1900-04-15 a 2099-04-12

Utiliza el algoritmo proporcionado por el Observatorio Naval de los Estados Unidos (USNO)

http://aa.usno.navy.mil/faq/docs/easter.php

CREATE FUNCTION dbo.GetEasterSunday (@Y INT) RETURNS DATETIME AS BEGIN -- Source of algorithm : http://aa.usno.navy.mil/faq/docs/easter.php DECLARE @c INT = @Y / 100 DECLARE @n INT = @Y - 19 * (@Y / 19) DECLARE @k INT = (@c - 17) / 25 DECLARE @i INT = @c - @c / 4 - (@c - @k) / 3 + 19 * @n + 15 SET @i = @i - 30 * (@i / 30) SET @i = @i - (@i / 28) * (1 - (@i / 28) * (29 / (@i + 1)) * ((21 - @n) / 11)) DECLARE @j INT = @Y + @Y / 4 + @i + 2 - @c + @c / 4 SET @j = @j - 7 * (@j / 7) DECLARE @l INT = @i - @j DECLARE @m INT = 3 + (@l + 40) / 44 DECLARE @d INT = @l + 28 - 31 * (@m / 4) RETURN ( SELECT CONVERT ( DATETIME, RTRIM(@Y) + RIGHT(''0''+RTRIM(@m), 2) + RIGHT(''0''+RTRIM(@d), 2) ) ) END GO


Python: usando la función easter() dateutil .

>>> from dateutil.easter import * >>> print easter(2010) 2010-04-04 >>> print easter(2011) 2011-04-24

Las funciones obtienen, como argumento, el tipo de cálculo que te gusta:

EASTER_JULIAN = 1 EASTER_ORTHODOX = 2 EASTER_WESTERN = 3

Puedes elegir el que sea relevante para los Estados Unidos.

Reducir dos días del resultado le daría un Viernes Santo:

>>> from datetime import timedelta >>> d = timedelta(days=-2) >>> easter(2011) datetime.date(2011, 4, 24) >>> easter(2011)+d datetime.date(2011, 4, 22)

Por extraño que parezca, alguien estaba repitiendo esto y publicó los resultados en el artículo de Wikipedia sobre el algoritmo :


en SQL Server El domingo de Pascua se vería así, desplácese hacia abajo para el Viernes Santo

CREATE FUNCTION dbo.GetEasterSunday ( @Y INT ) RETURNS SMALLDATETIME AS BEGIN DECLARE @EpactCalc INT, @PaschalDaysCalc INT, @NumOfDaysToSunday INT, @EasterMonth INT, @EasterDay INT SET @EpactCalc = (24 + 19 * (@Y % 19)) % 30 SET @PaschalDaysCalc = @EpactCalc - (@EpactCalc / 28) SET @NumOfDaysToSunday = @PaschalDaysCalc - ( (@Y + @Y / 4 + @PaschalDaysCalc - 13) % 7 ) SET @EasterMonth = 3 + (@NumOfDaysToSunday + 40) / 44 SET @EasterDay = @NumOfDaysToSunday + 28 - ( 31 * (@EasterMonth / 4) ) RETURN ( SELECT CONVERT ( SMALLDATETIME, RTRIM(@Y) + RIGHT(''0''+RTRIM(@EasterMonth), 2) + RIGHT(''0''+RTRIM(@EasterDay), 2) ) END GO

El Viernes Santo es así y usa la función de Pascua arriba.

CREATE FUNCTION dbo.GetGoodFriday ( @Y INT ) RETURNS SMALLDATETIME AS BEGIN RETURN (SELECT dbo.GetEasterSunday(@Y) - 2) END GO

Desde aquí: http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-calendar-table.html