Jump to content

Day of the week of Christmas and New Year

From Rosetta Code
Day of the week of Christmas and New Year is a draft programming task. It is not yet considered ready to be promoted as a complete task, for reasons that should be found in its talk page.
Task


Determine programatically and show on this page on what weekday Christmas Day, 2021 and New Year's Day, 2022 will fall or did fall.

11l

Translation of: Python
V weekDays = [‘Sunday’, ‘Monday’, ‘Tuesday’, ‘Wednesday’, ‘Thursday’, ‘Friday’, ‘Saturday’]
V thisXMas = Time(2021, 12, 25)
V thisXMasDay = Int(thisXMas.strftime(‘%w’))
V thisXMasDayAsString = weekDays[thisXMasDay]
print(‘This year's Christmas is on a ’thisXMasDayAsString)

V nextNewYear = Time(2022, 1, 1)
V nextNewYearDay = Int(nextNewYear.strftime(‘%w’))
V nextNewYearDayAsString = weekDays[nextNewYearDay]
print(‘Next new year is on a ’nextNewYearDayAsString)
Output:
This year's Christmas is on a Saturday
Next new year is on a Saturday

Ada

with Ada.Text_Io;
with Ada.Calendar.Formatting;

procedure Weekdays is
   use Ada.Text_Io;
   use Ada.Calendar.Formatting;

   subtype Time is Ada.Calendar.Time;

   procedure Info (Date : Time) is
   begin
      Put (Image (Date));
      Put (" is a ");
      Put (Day_Name'Image (Day_Of_Week (Date)));
      Put (".");
      New_Line;
   end Info;

   Christmas_Day : constant Time := Time_Of (Year => 2021, Month => 12, Day => 25);
   New_Years_Day : constant Time := Time_Of (Year => 2022, Month => 01, Day => 01);

begin
   Info (Christmas_Day);
   Info (New_Years_Day);
end Weekdays;
Output:
2021-12-25 00:00:00 is a SATURDAY.
2022-01-01 00:00:00 is a SATURDAY.

ALGOL 68

Translation of: ALGOL W
BEGIN # find the day of the week 25/12/2021 and 01/01/2022 fall on #
    []STRING day name =
        []STRING( "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" )[ AT 0 ];
    PROC day of week = ( INT d, m, y )INT:
         BEGIN
            INT mm := m;
            INT yy := y;
            IF mm <= 2 THEN
                mm +:= 12;
                yy -:= 1
            FI;
            INT j = yy OVER 100;
            INT k = yy MOD  100;
            ( d + ( ( mm + 1 ) * 26 ) OVER 10 + k + k OVER 4 + j OVER 4 + 5 * j ) MOD 7
         END # day of week # ;
    print( ( "25th of December 2021 is a ", day name[ day of week( 25, 12, 2021 ) ], newline ) );
    print( ( " 1st of January  2022 is a ", day name[ day of week(  1,  1, 2022 ) ], newline ) )
END
Output:
25th of December 2021 is a Saturday
 1st of January  2022 is a Saturday

ALGOL W

Re-using code from the Day of the week task.

begin % find the day of the week 25/12/2021 and 01/01/2022 fall on %
    string(10) array dayName( 0 :: 6 );
    integer procedure Day_of_week ( integer value d, m, y );
        begin
            integer j, k, mm, yy;
            mm := m;
            yy := y;
            if mm <= 2 then begin
                mm := mm + 12;
                yy := yy - 1;
            end if_m_le_2;
            j := yy div 100;
            k := yy rem 100;
            (d + ( ( mm + 1 ) * 26 ) div 10 + k + k div 4 + j div 4 + 5 * j ) rem 7
        end Day_of_week;
    dayName( 0 ) := "Saturday"; dayName( 1 ) := "Sunday";    dayName( 2 ) := "Monday";
    dayName( 3 ) := "Tuesday";  dayName( 4 ) := "Wednesday"; dayName( 5 ) := "Thursday";
    dayName( 6 ) := "Friday";
    write( "25th of December 2021 is a ", dayName( Day_of_week( 25, 12, 2021 ) ) );
    write( " 1st of January  2022 is a ", dayName( Day_of_week(  1,  1, 2022 ) ) )
end.
Output:
25th of December 2021 is a Saturday
 1st of January  2022 is a Saturday

AutoHotkey

FormatTime, xmas , 20211225, dddd
FormatTime, newYear , 20220101, dddd
MsgBox % result := "Christmas Day, 2021 : " xmas "`nNew Year's Day, 2022 : " newYear
Output:
Christmas Day, 2021 : Saturday
New Year's Day, 2022 : Saturday

AWK

# syntax: GAWK -f WHAT_WEEKDAYS_WILL_CHRISTMAS_AND_NEW_YEAR.AWK
BEGIN {
    fmt = "%Y-%m-%d is a %A"
    print(strftime(fmt,mktime("2021 12 25 0 0 0")))
    print(strftime(fmt,mktime("2022 01 01 0 0 0")))
    print("")
    fmt = "%d %b %Y is %A"
    print(strftime(fmt,mktime("2021 12 25 0 0 0")))
    print(strftime(fmt,mktime("2022 01 01 0 0 0")))
    exit(0)
}
Output:
2021-12-25 is a Saturday
2022-01-01 is a Saturday

25 Dec 2021 is Saturday
01 Jan 2022 is Saturday

BASIC

10 DEFINT A-Z
20 DIM D$(6)
30 FOR I=0 TO 6: READ D$(I): NEXT
40 FOR I=1 TO 2
50 READ Y,M,D
60 PRINT USING "##/##/#### is a ";M;D;Y;
70 IF M<=2 THEN M=M+12: Y=Y-1
80 J=Y\100
90 K=Y MOD 100
100 D=(D+((M+1)*26)\10+K+K\4+J\4+5*J) MOD 7
110 PRINT D$(D)
120 NEXT
130 DATA Saturday,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday
140 DATA 2021,12,25
150 DATA 2022,1,1
Output:
12/25/2021 is a Saturday
 1/ 1/2022 is a Saturday

BASIC256

print "Christmas Day 2021 is on a ";  diasemana$(2021, 12, 25)
print "New Year's Day 2022 is on a "; diasemana$(2022,  1,  1)
end

function diasemana$(anno, mes, dia)
	dim nombre$(6)
	nombre$ = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}
	if mes <= 2 then
		mes += 12
		anno -= 1
	end if
	dia = (dia-1 + ((mes+1)*26)\10 + anno + anno\4 + anno\400 + anno*6\100) mod 7
	return nombre$[dia]
end function

Chipmunk Basic

Works with: Chipmunk Basic version 3.6.4
Works with: QBasic
Translation of: QBasic
100 REM Day of the week of Christmas and New Year
110 CLS
120 DIM d$(6)
130 FOR i = 0 TO 6 : READ d$(i) : NEXT i
140 FOR i = 1 TO 2
150  READ y,m,d
160  PRINT m;"/";d;"/";y;" is a ";
170  IF m <= 2 THEN LET m = m+12 : LET y = y-1
180  LET j = INT(y/100)
190  LET k = y-INT(y/100)*100
200  LET t = (d+INT((m+1)*26)/10+k+k/4+j/4+5*j)
210  LET d = t-INT(t/7)*7
211  rem LET d = INT(d + ((m + 1) * 26) / 10 + K + K / 4 + J \ 4 + 5 * J) MOD 7
220  PRINT d$(d)
230 NEXT i
240 DATA "Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"
250 DATA 2021,12,25
260 DATA 2022,1,1
270 END

GW-BASIC

Works with: PC-BASIC version any
Works with: MSX BASIC
Works with: QBasic
Translation of: QBasic
100 REM Day of the week of Christmas and New Year
110 CLS
120 DIM d$(6)
130 FOR i = 0 TO 6: READ d$(i): NEXT i
140 FOR i = 1 TO 2
150  READ y, m, d
160  PRINT USING "##/##/#### is a "; m; d; y;
170  IF m <= 2 THEN m = m + 12: y = y - 1
180  j = y \ 100
190  k = y MOD 100
200  d = (d + ((m + 1) * 26) \ 10 + k + k \ 4 + j \ 4 + 5 * j) MOD 7
210  PRINT d$(d)
220 NEXT i
230 DATA Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
240 DATA 2021, 12, 25
250 DATA 2022, 1, 1
260 END

MSX Basic

The GW-BASIC solution works without any changes.

QBasic

Works with: QBasic version 1.1
Works with: QuickBasic version 4.5
DIM d$(6)
FOR i = 0 TO 6: READ d$(i): NEXT i
FOR i = 1 TO 2
    READ y, m, d
    PRINT USING "##/##/#### is a "; m; d; y;
    IF m <= 2 THEN m = m + 12: y = y - 1
    J = y \ 100
    K = y MOD 100
    d = (d + ((m + 1) * 26) \ 10 + K + K \ 4 + J \ 4 + 5 * J) MOD 7
    PRINT d$(d)
NEXT i
DATA Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
DATA 2021, 12, 25
DATA 2022, 1, 1
END

True BASIC

OPTION BASE 0
DIM d$(6)
FOR i = 0 TO 6
    READ d$(i)
NEXT i
FOR i = 1 TO 2
    READ y, m, d
    PRINT  USING "##/##/#### is a ": m, d, y;
    IF m <= 2 THEN
       LET m = m+12
       LET y = y-1
    END IF
    LET j = IP(round(y)/100)
    LET k = REMAINDER(ROUND(y),100)
    LET d = REMAINDER(ROUND((d+IP(ROUND(((m+1)*26))/10)+k+IP(ROUND(k)/4)+IP(ROUND(j)/4)+5*j)),7)
    PRINT d$(d)
NEXT i
DATA Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday
DATA 2021, 12, 25
DATA 2022, 1, 1
END

XBasic

Works with: Windows XBasic
PROGRAM	"progname"
VERSION	"0.0000"

DECLARE FUNCTION  Entry ()

FUNCTION  Entry ()
DIM d$[6]
d$[0] = "Saturday"
d$[1] = "Sunday"
d$[2] = "Monday"
d$[3] = "Tuesday"
d$[4] = "Wednesday"
d$[5] = "Thursday"
d$[6] = "Friday"

y = 2021: m = 12: d = 25
FOR i = 1 TO 2
    PRINT d; " /"; m; " /"; y; " is a ";
    IF m <= 2 THEN m = m + 12: y = y - 1
    J = y \ 100
    K = y MOD 100
    d = (d + ((m + 1) * 26) \ 10 + K + K \ 4 + J \ 4 + 5 * J) MOD 7
    PRINT d$[d]
    y = 2022: m = 1: d = 1
NEXT i
END FUNCTION
END PROGRAM

Yabasic

dim nombre$(6)
nombre$(0) = "Saturday"
nombre$(1) = "Sunday"
nombre$(2) = "Monday"
nombre$(3) = "Tuesday"
nombre$(4) = "Wednesday"
nombre$(5) = "Thursday"
nombre$(6) = "Friday"

print "Christmas Day 2021 is on a ",  diasemana$(2021, 12, 25)
print "New Year's Day 2022 is on a ", diasemana$(2022,  1,  1)
end

sub diasemana$(anno, mes, dia)
	if mes <= 2 then 
	    mes = mes + 12
		anno = anno - 1
	fi
	dia = mod((dia-1 + int(((mes+1)*26)/10) + anno + int(anno/4) + int(anno/400) + int(anno*6/100)), 7)
	return nombre$(dia)
end sub


BCPL

get "libhdr"

let dayofweek(y,m,d) = valof
$(  let j, k = ?, ?
    if m<=2
    $(  m := m+12
        y := y-1
    $)
    j := y/100
    k := y rem 100
    d := (d + ((m+1)*26)/10 + k + k/4 + j/4 + 5*j) rem 7
    switchon d into
    $(  case 0: resultis "Saturday"
        case 1: resultis "Sunday"
        case 2: resultis "Monday"
        case 3: resultis "Tuesday"
        case 4: resultis "Wednesday"
        case 5: resultis "Thursday"
        case 6: resultis "Friday"
    $)
$)

let show(y,m,d) be
    writef("%N/%N/%N is a %S*N", m, d, y, dayofweek(y, m, d))

let start() be
$(  show(2021,12,25)
    show(2022,1,1)
$)
Output:
12/25/2021 is a Saturday
1/1/2022 is a Saturday

C

#define _XOPEN_SOURCE
#include <stdio.h>
#include <time.h>

int main() {
    struct tm t[2];
    strptime("2021-12-25", "%F", &t[0]);
    strptime("2022-01-01", "%F", &t[1]);
    for (int i=0; i<2; i++) {
        char buf[32];
        strftime(buf, 32, "%F is a %A", &t[i]);
        puts(buf);
    }
    return 0;
}
Output:
2021-12-25 is a Saturday
2022-01-01 is a Saturday

CLU

day_of_week = proc (d: date) returns (string)
    own days: array[string] := array[string]$
        [0:"Saturday", "Sunday", "Monday", "Tuesday", 
           "Wednesday", "Thursday", "Friday"]
    
    m: int := d.month
    y: int := d.year
    if m <= 2 then
        m := m + 12
        y := y - 1
    end
    j: int := y/100
    k: int := y//100
    dn: int := (d.day + ((m+1)*26)/10 + k + k/4 + j/4 + 5*j)//7
    return(days[dn])
end day_of_week

start_up = proc ()
    po: stream := stream$primary_output()
    days: array[date] := array[date]$
        [date$create(25, 12, 2021, 0, 0, 0),
         date$create( 1,  1, 2022, 0, 0, 0)]
    
    for d: date in array[date]$elements(days) do
        stream$putl(po, date$unparse_date(d) || " is a " || day_of_week(d))
    end
end start_up
Output:
25 December 2021 is a Saturday
1 January 2022 is a Saturday

COBOL

       IDENTIFICATION DIVISION.
       PROGRAM-ID. XMASNY.
       
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 WEEKDAYS.
          03 DAY-NAMES.
             05 FILLER   PIC X(9) VALUE "Saturday ".
             05 FILLER   PIC X(9) VALUE "Sunday   ".
             05 FILLER   PIC X(9) VALUE "Monday   ".
             05 FILLER   PIC X(9) VALUE "Tuesday  ".
             05 FILLER   PIC X(9) VALUE "Wednesday".
             05 FILLER   PIC X(9) VALUE "Thursday ".
             05 FILLER   PIC X(9) VALUE "Friday   ".
          03 DAYS        PIC X(9) OCCURS 7 TIMES,
                         REDEFINES DAY-NAMES.
       01 OUT-FMT.
          03 OUT-MONTH   PIC 99.
          03 FILLER      PIC X VALUE "/".
          03 OUT-DAY     PIC 99.
          03 FILLER      PIC X VALUE "/".
          03 OUT-YEAR    PIC 9(4).
          03 FILLER      PIC X(6) VALUE " is a ".
          03 OUT-DAYNAME PIC X(9).
       
       01 VARIABLES.
          03 CDATE.
             05 D-MONTH  PIC 99.
             05 D-DAY    PIC 99.
             05 D-YEAR   PIC 9999.
          03 ZELLER-DATA.
             05 M        PIC 99.
             05 Y        PIC 99.
             05 D        PIC 999.
             05 D7       PIC 999.
             05 J        PIC 99.
             05 K        PIC 99.
             05 DAY-NAME PIC X(9).
       
       PROCEDURE DIVISION.
       BEGIN.
           MOVE "25122021" TO CDATE.
           PERFORM SHOW-WEEKDAY.
           MOVE "01012022" TO CDATE.
           PERFORM SHOW-WEEKDAY.
           STOP RUN.
       
       SHOW-WEEKDAY.
           MOVE D-MONTH TO OUT-MONTH.
           MOVE D-DAY TO OUT-DAY.
           MOVE D-YEAR TO OUT-YEAR.
           PERFORM ZELLER.
           MOVE DAY-NAME TO OUT-DAYNAME.
           DISPLAY OUT-FMT.
       
       ZELLER.
           MOVE D-MONTH TO M.
           MOVE D-YEAR TO Y.
           IF M IS NOT GREATER THAN 2,
               ADD 12 TO M,
               SUBTRACT 1 FROM Y.
           DIVIDE Y BY 100 GIVING J.
           COMPUTE K = Y - J * 100.
           COMPUTE D = (M + 1) * 26.
           DIVIDE 10 INTO D.
           ADD K TO D.
           DIVIDE 4 INTO K.
           ADD K TO D.
           COMPUTE D = D + 5 * J.
           DIVIDE 4 INTO J.
           COMPUTE D = D + J + D-DAY.
           DIVIDE D BY 7 GIVING D7.
           MULTIPLY 7 BY D7.
           COMPUTE D = D - D7 + 1.
           MOVE DAYS(D) TO DAY-NAME.
Output:
25/12/2021 is a Saturday
01/01/2022 is a Saturday

Cowgol

include "cowgol.coh";

record Date is
    year: uint16;
    month: uint8;
    day: uint8;
end record;

sub DayName(date: [Date]): (name: [uint8]) is
    var days: [uint8][] := {
        "Saturday", "Sunday", "Monday", "Tuesday",
        "Wednesday", "Thursday", "Friday"
    };
    
    var m := date.month as uint16;
    var y := date.year;
    var d := date.day as uint16;
    
    if m <= 2 then
        m := m + 12;
        y := y - 1;
    end if;
    
    var j := y / 100;
    var k := y % 100;
    d := (d + ((m+1)*26)/10 + k + k/4 + j/4 + 5*j) % 7;
    name := days[d as @indexof days];
end sub;

sub printDate(date: [Date]) is
    print_i8(date.month);
    print_char('/');
    print_i8(date.day);
    print_char('/');
    print_i16(date.year);
end sub;

var dates: Date[] := {
    {2021, 25, 12},
    {2022, 1, 1}
};

var i: @indexof dates := 0;
while i < @sizeof dates loop
    printDate(&dates[i]);
    print(" is a ");
    print(DayName(&dates[i]));
    print_nl();
    i := i + 1;
end loop;
Output:
25/12/2021 is a Saturday
1/1/2022 is a Saturday

Delphi

Works with: Delphi version 6.0

Delphi libraries make this easy.

procedure DoChristmasNewYear(Memo: TMemo);
var D: TDate;
begin
D:=EncodeDate(2021,12,25);
Memo.Lines.Add(FormatDateTime('"Christmas Day, 2021 is on: " dddd ', D));
D:=EncodeDate(2022,1,1);
Memo.Lines.Add(FormatDateTime('"New Years Day, 2022 is on: " dddd ', D));
end;
Output:
Christmas Day, 2021 is on:  Saturday 
New Years Day, 2022 is on:  Saturday 

Draco

type Date = struct {
    word year; 
    byte month, day
};

proc nonrec day_name(Date date) *char:
    word m, y, d, j, k;
    m := date.month;
    y := date.year;
    d := date.day;
    if m <= 2 then
        m := m + 12;
        y := y - 1
    fi;
    j := y / 100;
    k := y % 100;
    d := (d + ((m+1)*26)/10 + k + (k>>2) + (j>>2) + 5*j) % 7;
    case d 
        incase 0: "Saturday"
        incase 1: "Sunday"
        incase 2: "Monday"
        incase 3: "Tuesday"
        incase 4: "Wednesday"
        incase 5: "Thursday"
        incase 6: "Friday"
    esac
corp

proc nonrec print_date(Date d) void:
    write(d.month, '/', d.day, '/', d.year)
corp

proc nonrec main() void:
    [2] Date dates = ((2021, 12, 25), (2022, 1, 1));
    byte i;    
    for i from 0 upto 1 do
        print_date(dates[i]);
        writeln(" is a ", day_name(dates[i]))
    od
corp
Output:
12/25/2021 is a Saturday
1/1/2022 is a Saturday

EasyLang

func wkday year month day .
   adj = (14 - month) div 12
   mm = month + 12 * adj - 2
   yy = year - adj
   r = day + (13 * mm - 1) div 5 + yy + yy div 4 - yy div 100 + yy div 400
   return r mod 7 + 1
.
wkdays$[] = [ "Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday" ]
dates$[] = [ "2021-12-21" "2022-01-01" ]
for d$ in dates$[]
   write d$ & " is on "
   a[] = number strsplit d$ "-"
   print wkdays$[wkday a[1] a[2] a[3]]
.
Output:
2021-12-21 is on Tuesday
2022-01-01 is on Saturday

F#

// Show day of week for Christmas Day, 2021 and New Year's Day, 2022. Nigel Galloway: December 1st., 2021
printfn $"Christmas Day 2021 is a %s{string(System.DateTime(2021,12,25).DayOfWeek)}. New Years Day 2022 is a %s{string(System.DateTime(2022,1,1).DayOfWeek)}."
Output:
Christmas Day 2021 is a Saturday. New Years Day 2022 is a Saturday.

Factor

Works with: Factor version 0.99 2021-06-02
USING: calendar calendar.english calendar.holidays.us formatting
kernel sequences ;

CONSTANT: msg
    "In %d, New Years is on a %s, and Christmas is on a %s.\n"

: day-name ( ts -- str ) day-of-week day-names nth ;
: christmas ( n -- str ) christmas-day day-name ;
: new-years ( n -- str ) new-years-day day-name ;
: holidays ( n -- ny ch ) [ new-years ] [ christmas ] bi ;
: .holidays ( seq -- ) [ dup holidays msg printf ] each ;

{ 1578 1590 1642 1957 2020 2021 2022 2242 2245 2393 } .holidays
Output:
In 1578, New Years is on a Sunday, and Christmas is on a Monday.
In 1590, New Years is on a Monday, and Christmas is on a Tuesday.
In 1642, New Years is on a Wednesday, and Christmas is on a Thursday.
In 1957, New Years is on a Tuesday, and Christmas is on a Wednesday.
In 2020, New Years is on a Wednesday, and Christmas is on a Friday.
In 2021, New Years is on a Friday, and Christmas is on a Saturday.
In 2022, New Years is on a Saturday, and Christmas is on a Sunday.
In 2242, New Years is on a Saturday, and Christmas is on a Sunday.
In 2245, New Years is on a Wednesday, and Christmas is on a Thursday.
In 2393, New Years is on a Friday, and Christmas is on a Saturday.

FreeBASIC

#include "vbcompat.bi"       'contains functions for dealing with dates and times
#include "string.bi"         'contains functions for formatting text strings

dim as double christmas = DateSerial(2021, 12, 25)      'enter the dates of the two holidays
dim as double newyears  = DateSerial(2022, 01, 01)

print "Christmas Day 2021 is on a "; format(christmas,"dddd")
print "New Year's Day 2022 is on a "; format(newyears, "dddd")
Output:

Christmas Day 2021 is on a Saturday New Year's Day 2022 is on a Saturday

J

   (weekday 2021 12 25){::;:'Sun Mon Tue Wed Thu Fri Sat'
Sat
   (weekday 2022 01 01){::;:'Sun Mon Tue Wed Thu Fri Sat'
Sat

jq

Works with: jq

Works with gojq, the Go implementation of jq

Years, output format, and output are exactly as for Wren.

def weekdaynames:
  ["Sunday", "Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];

# example: weekday(1999; 12; 25)
def weekday($year; $month; $day):
  "\($year)-\($month)-\($day)" | strptime("%Y-%m-%d") | weekdaynames[.[-2]];

1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393
| "In \(.), New year's day is on a \(weekday(.;1;1)), and Christmas day on \(weekday(.;12;25))."
Output:

As for #Wren

Julia

See also https://docs.julialang.org/en/v1/stdlib/Dates/#Dates.format-Tuple{TimeType,%20AbstractString}

using Dates

for year in [1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393]
    println("Year $year, New Years's Day: ", Dates.format(DateTime(year, 1, 1), "E, U d, Y"),
        " and Christmas: ", Dates.format(DateTime(year, 12, 25), "E, U d, Y"))
end
Output:
Year 1578, New Years's Day: Sunday, January 1, 1578 and Christmas: Monday, December 25, 1578
Year 1590, New Years's Day: Monday, January 1, 1590 and Christmas: Tuesday, December 25, 1590
Year 1642, New Years's Day: Wednesday, January 1, 1642 and Christmas: Thursday, December 25, 1642
Year 1957, New Years's Day: Tuesday, January 1, 1957 and Christmas: Wednesday, December 25, 1957
Year 2020, New Years's Day: Wednesday, January 1, 2020 and Christmas: Friday, December 25, 2020
Year 2021, New Years's Day: Friday, January 1, 2021 and Christmas: Saturday, December 25, 2021
Year 2022, New Years's Day: Saturday, January 1, 2022 and Christmas: Sunday, December 25, 2022
Year 2242, New Years's Day: Saturday, January 1, 2242 and Christmas: Sunday, December 25, 2242
Year 2245, New Years's Day: Wednesday, January 1, 2245 and Christmas: Thursday, December 25, 2245
Year 2393, New Years's Day: Friday, January 1, 2393 and Christmas: Saturday, December 25, 2393

Nim

import std/times

echo "25th of December 2021 is a ", getDayOfWeek(25, mDec, 2021)
echo "1st of January 2022 is a ", getDayOfWeek(1, mJan, 2022)
Output:
25th of December 2021 is a Saturday
1st of January 2022 is a Saturday

Nu

Works with: Nushell version 0.96.1
[2021-12-25 2022-01-01] | each { format date "%F \u{25b6} %A\n" } | str join
Output:
2021-12-25 ▶ Saturday
2022-01-01 ▶ Saturday

Oberon-07

Using the minimal Dates module from the Find the last Sunday of_each month#Oberon-07 sample (code not repeated here), we can solve the task:

MODULE ChristmasAndNewYear;
    IMPORT Dates, Out;

PROCEDURE OutDayName ( day : INTEGER ) ;
    BEGIN
        IF    day = Dates.SUNDAY    THEN Out.String( "Sunday"    )
        ELSIF day = Dates.MONDAY    THEN Out.String( "Monday"    )
        ELSIF day = Dates.TUESDAY   THEN Out.String( "Tuesday"   )
        ELSIF day = Dates.WEDNESDAY THEN Out.String( "Wednesday" )
        ELSIF day = Dates.THURSDAY  THEN Out.String( "Thursday"  )
        ELSIF day = Dates.FRIDAY    THEN Out.String( "Friday"    )
        ELSIF day = Dates.SATURDAY  THEN Out.String( "Saturday"  )
        ELSE                             Out.String( "Invaliday" )
        END
    END OutDayName ;
BEGIN
    Out.String( "25th of December 2024 is a " ); OutDayName( Dates.dayOfWeek( 25, 12, 2024 ) );
    Out.Ln;
    Out.String( " 1st of January  2025 is a " ); OutDayName( Dates.dayOfWeek(  1,  1, 2025 ) )
END ChristmasAndNewYear.
Output:
25th of December 2024 is a Wednesday
 1st of January  2025 is a Wednesday

ooRexx

/* REXX */
Call wkd 2021,12,25
Call wkd 2022,01,01
Exit
wkd:
Parse Arg y,m,d
wd=.Array~of('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday')
dt=.DateTime~new(y,m,d)
say d'.'m'.'y 'is a' wd[dt~weekday]
Return
Output:
25.12.2021 is a Saturday
01.01.2022 is a Saturday<

Pascal

Free Pascal

Program daysofweek;
Uses sysutils;

Const Years : array Of integer = (1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393);

Var christmasday, newyearsday : tdatetime;
  year : integer;
Begin
  For year In years Do
    Begin
      christmasday := encodeDate(year,12,25);
      newyearsday := encodeDate(year,1,1);
      writeln('in ',year,' New Years day is on ',DefaultFormatSettings.LongDayNames[DayOfWeek(
              newyearsday)],', and Christmas day on a ',DefaultFormatSettings.LongDayNames[DayOfWeek(
                                                                                        christmasday
      )]);
    End;
End.
Output:
in 1578 New Years day is on Sunday, and Christmas day on a Monday
in 1590 New Years day is on Monday, and Christmas day on a Tuesday
in 1642 New Years day is on Wednesday, and Christmas day on a Thursday
in 1957 New Years day is on Tuesday, and Christmas day on a Wednesday
in 2020 New Years day is on Wednesday, and Christmas day on a Friday
in 2021 New Years day is on Friday, and Christmas day on a Saturday
in 2022 New Years day is on Saturday, and Christmas day on a Sunday
in 2242 New Years day is on Saturday, and Christmas day on a Sunday
in 2245 New Years day is on Wednesday, and Christmas day on a Thursday
in 2393 New Years day is on Friday, and Christmas day on a Saturday


Perl

#!/usr/bin/perl

use strict; # https://rosettacode.org/wiki/What_weekdays_will_Christmas_and_New_Year
use warnings;
use Time::Local;

for (
  ['Christmas 2021', 25, 11, 2021 ],
  ['New Years 2022', 1, 0, 2022 ],
  )
  {
  print "$_->[0] ", qw( Sunday Monday Tuesday Wednesday Thursday Fridat Saturday )
    [(localtime timelocal(0, 0, 12, @{$_}[1..3]))[6]], "\n";
  }
Output:
Christmas 2021 Saturday
New Years 2022 Saturday

Phix

with javascript_semantics
include timedate.e
procedure nyc(integer year)
    string ny = format_timedate({year,1,1,0,0,0},"Dddd"),
           cd = format_timedate({year,12,25,0,0,0},"Dddd")
    printf(1,"In %d, New year's day is on a %s, and Christmas day on a %s.\n",{year,ny,cd})
end procedure
papply({1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393},nyc)

Note the builtin timedate type does not officially support dates prior to 1752... the fact that the first three lines agree with other entries on this page is pure luck.

Output:
In 1578, New year's day is on a Sunday, and Christmas day on a Monday.
In 1590, New year's day is on a Monday, and Christmas day on a Tuesday.
In 1642, New year's day is on a Wednesday, and Christmas day on a Thursday.
In 1957, New year's day is on a Tuesday, and Christmas day on a Wednesday.
In 2020, New year's day is on a Wednesday, and Christmas day on a Friday.
In 2021, New year's day is on a Friday, and Christmas day on a Saturday.
In 2022, New year's day is on a Saturday, and Christmas day on a Sunday.
In 2242, New year's day is on a Saturday, and Christmas day on a Sunday.
In 2245, New year's day is on a Wednesday, and Christmas day on a Thursday.
In 2393, New year's day is on a Friday, and Christmas day on a Saturday.

PL/I

xmas_and_newyear: procedure options(main);
    day_name: procedure(year,month,day) returns(char(9) varying);
        declare days(0:6) char(9) varying;
        declare (year, month, day) fixed;
        declare (y, m, d, j, k) fixed;
        days(0) = 'Saturday';
        days(1) = 'Sunday';
        days(2) = 'Monday';
        days(3) = 'Tuesday';
        days(4) = 'Wednesday';
        days(5) = 'Thursday';
        days(6) = 'Friday';
        
        m = month;
        y = year;
        if m <= 2 then do;
            m = m + 12;
            y = y -1;
        end;
        j = y/100;
        k = mod(y,100);
        d = mod((day + ((m+1)*26)/10 + k + k/4 + j/4 + 5*j),7);
        return(days(d));
    end day_name;
    
    declare years(2)  fixed static initial(2021, 2022);
    declare months(2) fixed static initial(  12,    1);
    declare days(2)   fixed static initial(  25,    1);
    declare i fixed;
    do i=1 to 2;
        put skip edit(months(i),'/',days(i),'/',years(i),
                      ' is a ',
                      day_name(years(i),months(i),days(i)))
            (F(2),A,F(2),A,F(4),A,A);
    end;
end xmas_and_newyear;
Output:
12/25/2021 is a Saturday
 1/ 1/2022 is a Saturday

PL/M

100H:
BDOS: PROCEDURE(F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; GO TO 0; END EXIT;
PR$CH: PROCEDURE(C); DECLARE C BYTE; CALL BDOS(2,C); END PR$CH; 
PR$STR: PROCEDURE(S); DECLARE S ADDRESS; CALL BDOS(9,S); END PR$STR;

PR$NUM: PROCEDURE(N);
    DECLARE S(6) BYTE INITIAL ('.....$');
    DECLARE (N, P) ADDRESS, D BASED P BYTE;
    P = .S(5);
DIGIT:
    P = P-1;
    D = '0' + N MOD 10;
    IF (N := N/10) > 0 THEN GO TO DIGIT;
    CALL PR$STR(P);
END PR$NUM;

DAY$NAME: PROCEDURE(Y,M,D) ADDRESS;
    DECLARE (Y,M,D,J,K) ADDRESS;
    IF M <= 2 THEN DO;
        M = M + 12;
        Y = Y - 1;
    END;
    J = Y / 100;
    K = Y MOD 100;
    D = (D + ((M+1)*26)/10 + K + SHR(K,2) + SHR(J,2) + 5*6) MOD 7;
    DO CASE D;
        RETURN .'SATURDAY$';
        RETURN .'SUNDAY$';
        RETURN .'MONDAY$';
        RETURN .'TUESDAY$';
        RETURN .'WEDNESDAY$';
        RETURN .'THURSDAY$';
        RETURN .'FRIDAY$';
    END;
END DAY$NAME;

PR$DATE: PROCEDURE(Y,M,D);  
    DECLARE Y ADDRESS, (M, D) BYTE;
    CALL PR$NUM(M);
    CALL PR$CH('/');
    CALL PR$NUM(D);
    CALL PR$CH('/');
    CALL PR$NUM(Y);
END PR$DATE;

DECLARE YEARS(2)  ADDRESS INITIAL (2021, 2022);
DECLARE MONTHS(2) BYTE    INITIAL (  12,    1);
DECLARE DAYS(2)   BYTE    INITIAL (  25,    1);
DECLARE I BYTE;

DO I=0 TO 1;
    CALL PR$DATE(YEARS(I),MONTHS(I),DAYS(I));
    CALL PR$STR(.' IS A $');
    CALL PR$STR(DAY$NAME(YEARS(I),MONTHS(I),DAYS(I)));
    CALL PR$STR(.(13,10,'$'));
END;
CALL EXIT;
EOF
Output:
12/25/2021 IS A SATURDAY
1/1/2022 IS A SATURDAY

Python

import datetime

weekDays = ("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday")
thisXMas  = datetime.date(2021,12,25)
thisXMasDay = thisXMas.weekday()
thisXMasDayAsString = weekDays[thisXMasDay]
print("This year's Christmas is on a {}".format(thisXMasDayAsString))

nextNewYear = datetime.date(2022,1,1)
nextNewYearDay = nextNewYear.weekday()
nextNewYearDayAsString = weekDays[nextNewYearDay]
print("Next new year is on a {}".format(nextNewYearDayAsString))
Output:
This year's Christmas is on a Saturday
Next new year is on a Saturday

Quackery

dayofweek is defined at Day of the week#Quackery.

  [ [ table
      $ "Sun"   $ "Mon"
      $ "Tues"  $ "Wednes"
      $ "Thurs" $ "Fri"
      $ "Satur"  ]
    do $ "day" join ]        is day       ( n --> $ )

  [ 25 12 rot dayofweek ]    is christmas ( n --> $ )

  [ 1 1 rot dayofweek  ]     is newyear's ( n --> $ )

  2021 christmas day echo$ cr
  2022 newyear's day echo$ cr
Output:
Saturday
Saturday

Raku

my @d-o-w = < Sunday Monday Tuesday Wednesday Thursday Friday Saturday >;

.say for (flat 2020..2022, (1500 .. 2500).roll(7)).sort.map: {
     "In {$_}, New Years is on a { @d-o-w[Date.new($_,  1,  1).day-of-week % 7] }, " ~
     "and Christmas on a { @d-o-w[Date.new($_, 12, 25).day-of-week % 7] }."
}
Sample output:
In 1578, New Years is on a Sunday, and Christmas on a Monday.
In 1590, New Years is on a Monday, and Christmas on a Tuesday.
In 1642, New Years is on a Wednesday, and Christmas on a Thursday.
In 1957, New Years is on a Tuesday, and Christmas on a Wednesday.
In 2020, New Years is on a Wednesday, and Christmas on a Friday.
In 2021, New Years is on a Friday, and Christmas on a Saturday.
In 2022, New Years is on a Saturday, and Christmas on a Sunday.
In 2242, New Years is on a Saturday, and Christmas on a Sunday.
In 2245, New Years is on a Wednesday, and Christmas on a Thursday.
In 2393, New Years is on a Friday, and Christmas on a Saturday.

Ring

? "working..."
weekdays = ["Mon","Tues","Wednes","Thurs","Fri","Satur","Sun"]
dow = timelist()[15]
today = date()
tycd = "25/12/" + substr(today, 7, 4)
nnyd = "01/01/" + string(number(substr(today, 7, 4)) + 1)
for day = 0 to 366
  anotherday = adddays(today, day)
  if anotherday = tycd
    ? "This year's Christmas day is on a " + nameof(day) + "."
  ok
  if anotherday = nnyd
    ? "The next New Year's day is on a " + nameof(day) + "."
    exit
  ok
next
put "done..."

func nameof day
    return weekdays[((day + today - 1) % 7) + 1] + "day"
Output:
working...
This year's Christmas day is on a Saturday.
The next New Year's day is on a Saturday.
done...

RPL

Works with: HP version 48
≪ 1000000 / 25.12 + 0 
   TSTR 1 3 SUB
   "X-MAS: " OVER +
   "NEW YEAR: " ROT +
 ≫ 'TASK' STO 
2021 TASK
Output:
2: "X-MAS: SAT"
1: "NEW YEAR: SAT"

Ruby

This uses the same years as the Raku example. The Ruby Date class does however take the calendar reform (default 1582) into account, so the days for 1578 differ from all other languages so far.

require 'date'

years = [1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393]
years.each do |year|
  xmas = Date.new(year,12,25).strftime("%A")
  ny =   Date.new(year, 1, 1).strftime("%A")
  puts "In #{year}, New year's day is on a #{ny}, and Christmas day on #{xmas}."
end
Output:
In 1578, New year's day is on a Wednesday, and Christmas day on Thursday.
In 1590, New year's day is on a Monday, and Christmas day on Tuesday.
In 1642, New year's day is on a Wednesday, and Christmas day on Thursday.
In 1957, New year's day is on a Tuesday, and Christmas day on Wednesday.
In 2020, New year's day is on a Wednesday, and Christmas day on Friday.
In 2021, New year's day is on a Friday, and Christmas day on Saturday.
In 2022, New year's day is on a Saturday, and Christmas day on Sunday.
In 2242, New year's day is on a Saturday, and Christmas day on Sunday.
In 2245, New year's day is on a Wednesday, and Christmas day on Thursday.
In 2393, New year's day is on a Friday, and Christmas day on Saturday.

Wren

Library: Wren-date

This uses the same years as the Raku example.

The above module uses the Gregorian Proleptic calendar and therefore gives the wrong days of the week for 1578 as the earliest year for the adoption of the Gregorian calendar was 1582 when 10 days (from 5th until 14th October inclusive) were omitted. To get the correct days for 1578 (and agree with the Ruby entry) we therefore need to add 10 days to the Gregorian date which the Date.fromJulian method does automatically.

import "./date" for Date

System.print("Days of week per Gregorian Proleptic calendar:")
var years = [1578, 1590, 1642, 1957, 2020, 2021, 2022, 2242, 2245, 2393]
for (year in years) {
    var newYear = Date.new(year, 1, 1).weekDay
    var xmas = Date.new(year, 12, 25).weekDay
    System.print("  In %(year), New year's day is on a %(newYear), and Christmas day on %(xmas).")
}
System.print("\nActual days for 1578 (Julian calendar) were 10 days later:")
System.print("  New Year's day was on %(Date.fromJulian(1578, 1, 1).weekDay), and Christmas day on %(Date.fromJulian(1578, 12, 25).weekDay).")
Output:
Days of week per Gregorian Proleptic calendar:
  In 1578, New year's day is on a Sunday, and Christmas day on Monday.
  In 1590, New year's day is on a Monday, and Christmas day on Tuesday.
  In 1642, New year's day is on a Wednesday, and Christmas day on Thursday.
  In 1957, New year's day is on a Tuesday, and Christmas day on Wednesday.
  In 2020, New year's day is on a Wednesday, and Christmas day on Friday.
  In 2021, New year's day is on a Friday, and Christmas day on Saturday.
  In 2022, New year's day is on a Saturday, and Christmas day on Sunday.
  In 2242, New year's day is on a Saturday, and Christmas day on Sunday.
  In 2245, New year's day is on a Wednesday, and Christmas day on Thursday.
  In 2393, New year's day is on a Friday, and Christmas day on Saturday.

Actual days for 1578 (Julian calendar) were 10 days later:
  New Year's day was on Wednesday, and Christmas day on Thursday.

XPL0

func    WeekDay(Year, Month, Day);      \Return address of day of week
int     Year, Month, Day;               \Works for years 1583 onward
int     DayOfWeek, Names;
[if     Month<=2 then [Month:= Month+12;  Year:= Year-1];
DayOfWeek:= rem((Day-1 + (Month+1)*26/10 + Year + Year/4 + Year/100*6 + Year/400)/7);
Names:= ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
return Names(DayOfWeek);
];      \WeekDay

[Text(0, "This Christmas is on a ");
Text(0, WeekDay(2021, 12, 25));  CrLf(0);
Text(0, "This New Year's Day is on a ");
Text(0, WeekDay(2022,  1,  1));  CrLf(0);
]
Output:
This Christmas is on a Saturday
This New Year's Day is on a Saturday
Cookies help us deliver our services. By using our services, you agree to our use of cookies.