Find the last Sunday of each month: Difference between revisions

Add Easylang
(Add Easylang)
 
(32 intermediate revisions by 15 users not shown)
Line 26:
=={{header|11l}}==
 
<langsyntaxhighlight lang="11l">F last_sundays(year)
[String] sundays
L(month) 1..12
Line 37:
R sundays
 
print(last_sundays(2013).join("\n"))</langsyntaxhighlight>
 
{{out}}
Line 57:
=={{header|360 Assembly}}==
The program uses one ASSIST macro (XPRNT) to keep the code as short as possible.
<langsyntaxhighlight lang="360asm">* Last Sunday of each month 31/01/2017
LASTSUND CSECT
USING LASTSUND,R13 base register
Line 135:
DW DS D packed (PL8) 15num
YREGS
END LASTSUND</langsyntaxhighlight>
{{out}}
<pre>
2013-01-27
2013-02-24
2013-03-31
2013-04-28
2013-05-26
2013-06-30
2013-07-28
2013-08-25
2013-09-29
2013-10-27
2013-11-24
2013-12-29
</pre>
 
=={{header|Action!}}==
Day of the week is determined using [https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Sakamoto.27s_methods Sakamoto method].
<syntaxhighlight lang="action!">;https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Sakamoto.27s_methods
BYTE FUNC DayOfWeek(INT y BYTE m,d) ;1<=m<=12, y>1752
BYTE ARRAY t=[0 3 2 5 0 3 5 1 4 6 2 4]
BYTE res
 
IF m<3 THEN
y==-1
FI
res=(y+y/4-y/100+y/400+t(m-1)+d) MOD 7
RETURN (res)
 
BYTE FUNC IsLeapYear(INT y)
IF y MOD 100=0 THEN
IF y MOD 400=0 THEN
RETURN (1)
ELSE
RETURN (0)
FI
FI
IF y MOD 4=0 THEN
RETURN (1)
FI
RETURN (0)
 
INT FUNC GetMaxDay(INT y BYTE m)
BYTE ARRAY MaxDay=[31 28 31 30 31 30 31 31 30 31 30 31]
 
IF m=2 AND IsLeapYear(y)=1 THEN
RETURN (29)
FI
RETURN (MaxDay(m-1))
 
PROC PrintB2(BYTE x)
IF x<10 THEN
Put('0)
FI
PrintB(x)
RETURN
 
PROC Main()
INT MinYear=[1753],MaxYear=[9999],y
BYTE m,d,last,maxD
 
DO
PrintF("Input year in range %I...%I: ",MinYear,MaxYear)
y=InputI()
UNTIL y>=MinYear AND y<=MaxYear
OD
 
FOR m=1 TO 12
DO
last=0
maxD=GetMaxDay(y,m)
FOR d=1 TO maxD
DO
IF DayOfWeek(y,m,d)=0 THEN
last=d
FI
OD
PrintI(y) Put('-)
PrintB2(m) Put('-)
PrintB2(last) PutE()
OD
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Find_the_last_Sunday_of_each_month.png Screenshot from Atari 8-bit computer]
<pre>
Input year in range 1753...9999: 2013
2013-01-27
2013-02-24
Line 170 ⟶ 255:
2013-11-24
2013-12-29</pre>
 
=={{header|ALGOL 68}}==
{{Trans|ALGOL W}}
<syntaxhighlight lang="algol68">BEGIN # find the last Sunday in each month of a year #
# returns true if year is a leap year, false otherwise #
# assumes year is in the Gregorian Calendar #
PROC is leap year = ( INT year )BOOL:
year MOD 400 = 0 OR ( year MOD 4 = 0 AND year MOD 100 /= 0 );
# returns the day of the week of the specified date (d/m/y) #
# Sunday = 1 #
PROC day of week = ( INT d, m, y )INT:
BEGIN
INT mm := m;
INT yy := y;
IF mm <= 2 THEN
mm := mm + 12;
yy := 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 # ;
# returns an array of the last Sunday of each month in year #
PROC last sundays = ( INT year )[]INT:
BEGIN
[ 1 : 12 ]INT last days := ( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
IF is leap year( year ) THEN last days[ 2 ] := 29 FI;
# for each month, determine the day number of the #
# last Sunday #
[ 1 : 12 ]INT last;
FOR m pos TO 12 DO
INT dow := day of week( last days[ m pos ], m pos, year );
IF dow = 0 # Saturday # THEN dow := 7 FI;
# calculate the offset for the previous Sunday #
last[ m pos ] := ( last days[ m pos ] + 1 ) - dow
OD;
last
END # last sundays # ;
# test the last sundays procedure #
INT year = 2021;
[]INT last = last sundays( year );
FOR m pos TO 12 DO
print( ( whole( year, 0 )
, IF m pos < 10 THEN "-0" ELSE "-1" FI
, whole( m pos MOD 10, 0 )
, "-"
, whole( last[ m pos ], 0 )
, newline
)
)
OD
END</syntaxhighlight>
{{out}}
<pre>
2021-01-31
2021-02-28
2021-03-28
2021-04-25
2021-05-30
2021-06-27
2021-07-25
2021-08-29
2021-09-26
2021-10-31
2021-11-28
2021-12-26
</pre>
 
=={{header|ALGOL-M}}==
<syntaxhighlight lang="algol">
<lang ALGOL>
BEGIN
 
Line 202 ⟶ 354:
END;
 
% RETURN TRUE (1) IF Y IS A LEAP YEAR, OTHERWISE FALSE (0) %
INTEGER FUNCTION ISLEAPYR(Y);
INTEGER Y;
BEGIN
IF MOD(Y,4) <> 0 THEN % QUICK EXIT IN MOST COMMON CASE %
ISLEAPYR := 0
ELSE IF MOD(Y,400) = 0 THEN
Line 212 ⟶ 364:
ELSE IF MOD(Y,100) = 0 THEN
ISLEAPYR := 0
ELSE % NON-CENTURY AND DIVISIBLE BY 4 %
ELSE
ISLEAPYR := 1;
END;
Line 234 ⟶ 386:
 
COMMENT
RETURN THE DAY OF THE MONTH CORRESPONDING TO LAST OCCURANCEOCCURRENCE
OF WEEKDAY K (SUN=0, MON=1, ETC.) FOR A GIVEN MONTH AND YEAR;
INTEGER FUNCTION LASTKDAY(K, M, Y);
Line 243 ⟶ 395:
D := MONTHDAYS(M, Y);
W := DAYOFWEEK(M, D, Y);
% FINDBACK NEARESTUP PRIORAS OCCURANCENEEDED OFTO DESIRED WEEKDAY %
IF W >= K THEN
D := D - (W - K)
Line 272 ⟶ 424:
% EXERCISE THE ROUTINE %
INTEGER M, Y, SUNDAY;
SUNDAY := 0;
WRITE("DISPLAY LAST SUNDAY OF EACHSUNDAYS MONTHFOR INWHAT 2021YEAR?");
READ(Y);
FOR M:=1 STEP 1 UNTIL 12 DO
WRITE(MONTHNAME(M), LASTKDAY(SUNDAY,M,2021Y));
 
END
</syntaxhighlight>
</lang>
{{out}}
<pre>
DISPLAY LAST SUNDAYS FOR WHAT YEAR?
LAST SUNDAY OF EACH MONTH IN 2021
-> 2021
JAN 31
FEB 28
Line 299 ⟶ 453:
=={{header|ALGOL W}}==
Uses the Day_of_week and isLeapYear procedures from the day-of-the-week and leap-year tasks - included here for convenience.
<langsyntaxhighlight lang="algolw">begin % find the last Sunday in each month of a year %
% returns true if year is a leap year, false otherwise %
% assumes year is in the Gregorian Calendar %
Line 354 ⟶ 508:
for mPos := 1 until 12 do write( year, if mPos < 10 then "-0" else "-1", mPos rem 10, "-", last( mPos ) )
end
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 375 ⟶ 529:
{{Trans|JavaScript}}
 
<langsyntaxhighlight AppleScriptlang="applescript">-- LAST SUNDAYS OF YEAR ------------------------------------------------------
 
-- lastSundaysOfYear :: Int -> [Date]
Line 560 ⟶ 714:
map(column, item 1 of xss)
end transpose</langsyntaxhighlight>
{{Out}}
<pre>2015-01-25 2016-01-31 2017-01-29 2018-01-28 2019-01-27
Line 581 ⟶ 735:
AppleScript's weekday constants can be coerced either to English text or to the integers 1 (for Sunday) to 7 (Saturday).
 
<langsyntaxhighlight AppleScriptlang="applescript">on lastSundayOfEachMonthInYear(y)
-- Initialise an AppleScript date to the first day of some month in the specified year.
tell (current date) to set {firstDayOfNextMonth, its day, its year} to {it, 1, y}
Line 603 ⟶ 757:
end lastSundayOfEachMonthInYear
 
lastSundayOfEachMonthInYear(2020)</langsyntaxhighlight>
 
{{Out}}
Line 622 ⟶ 776:
The above is hard-coded for Sundays. As with the "Last Friday of each month" task [[https://www.rosettacode.org/wiki/Last_Friday_of_each_month#AppleScript Last Friday of each month]], the handler can be made more flexible with a weekday constant parameter, so that it can be used for any last weekday of the months:
 
<langsyntaxhighlight AppleScriptlang="applescript">on lastWeekdayWOfEachMonthInYear(w, y) -- Parameters: (AppleScript weekday constant, AD year number)
-- Initialise an AppleScript date to the first day of some month in the specified year.
tell (current date) to set {firstDayOfNextMonth, its day, its year} to {it, 1, y}
Line 646 ⟶ 800:
end lastWeekdayWOfEachMonthInYear
 
lastWeekdayWOfEachMonthInYear(Sunday, 2020)</langsyntaxhighlight>
{{Out}}
<pre>"./last_Sundays 2020
Line 664 ⟶ 818:
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">lastSundayForMonth: function [m,y][
ensure -> in? m 1..12
 
Line 680 ⟶ 834:
]
 
getLastSundays 2013</langsyntaxhighlight>
 
{{out}}
Line 698 ⟶ 852:
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">InputBox, Year, , Enter a year., , 300, 135
Date := Year . "0101"
 
Line 717 ⟶ 871:
 
Gui, Show
return</langsyntaxhighlight>
{{out}}
<pre>Last Sundays of 2013:
Line 735 ⟶ 889:
 
=={{header|AWK}}==
<syntaxhighlight lang="awk">
<lang AWK>
# syntax: GAWK -f FIND_THE_LAST_SUNDAY_OF_EACH_MONTH.AWK [year]
BEGIN {
Line 753 ⟶ 907:
exit(0)
}
</syntaxhighlight>
</lang>
<p>Output:</p>
<pre>
Line 772 ⟶ 926:
=={{header|Batch File}}==
Uses day of week, last day of month and leapyear routines
<syntaxhighlight lang="batch file">
<lang Batch File>
@echo off
setlocal enabledelayedexpansion
Line 808 ⟶ 962:
set /a "%2=^!(%1%%4)+(^!^!(%1%%100)-^!^!(%1%%400))"
exit /b
</syntaxhighlight>
</lang>
{{out}}
Line 829 ⟶ 983:
 
=={{header|BBC BASIC}}==
<langsyntaxhighlight lang="bbcbasic">
INSTALL @lib$+"DATELIB"
 
Line 839 ⟶ 993:
NEXT
END
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 861 ⟶ 1,015:
=={{header|Befunge}}==
This is essentially identical to [[Last_Friday_of_each_month#Befunge|Last Friday of each month]] except for the initial day offset.
<langsyntaxhighlight lang="befunge">":raeY",,,,,&>55+,:::45*:*%\"d"%!*\4%+!3v
v2++6**"I"5\+/*:*54\-/"d"\/4::-1::p53+g5<
>:00p5g4-+7%\:0\v>,"-",5g+:55+/68*+,55+%v
^<<_$$vv*86%+55:<^+*86%+55,+*86/+55:-1:<6
>$$^@$<>+\55+/:#^_$>:#,_$"-",\:04-\-00g^8
^<# #"#"##"#"##!` +76:+1g00,+55,+*<</langsyntaxhighlight>
 
{{out}}
Line 887 ⟶ 1,041:
Identical to [[Last_Friday_of_each_month#C|Last Friday of each month]] except for removal of the offset day in the output.
 
<syntaxhighlight lang="c">
<lang C>
#include <stdio.h>
#include <stdlib.h>
Line 907 ⟶ 1,061:
return 0;
}
</syntaxhighlight>
</lang>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
 
namespace LastSundayOfEachMonth
Line 943 ⟶ 1,097:
}
}
</syntaxhighlight>
</lang>
{{out}}
<pre>Year to calculate: 2013
Line 961 ⟶ 1,115:
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">
#include <windows.h>
#include <iostream>
Line 1,061 ⟶ 1,215:
}
//--------------------------------------------------------------------------------------------------
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,080 ⟶ 1,234:
</pre>
Other solution, based on the Boost DateTime library:
<langsyntaxhighlight Clang="c++">#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
#include <cstdlib>
Line 1,102 ⟶ 1,256:
}
return 0 ;
}</langsyntaxhighlight>
{{out}}
<pre>2013-Jan-27
Line 1,116 ⟶ 1,270:
2013-Nov-24
2013-Dec-29
</pre>
===Using C++20===
Using C++20 this task can be completed without external libraries.
<syntaxhighlight lang="c++">
 
#include <chrono>
#include <iostream>
 
int main() {
std::cout << "The dates of the last Sunday in each month of 2023:" << std::endl;
 
for ( unsigned int m = 1; m <= 12; ++m ) {
std::chrono::days days_in_month = std::chrono::sys_days{std::chrono::year{2023}/m/std::chrono::last}
- std::chrono::sys_days{std::chrono::year{2023}/m/1} + std::chrono::days{1};
 
const unsigned int last_day = days_in_month / std::chrono::days{1};
std::chrono::year_month_day ymd{std::chrono::year{2023}, std::chrono::month{m}, std::chrono::day{last_day}};
 
while ( std::chrono::weekday{ymd} != std::chrono::Sunday ) {
ymd = std::chrono::sys_days{ymd} - std::chrono::days{1};
}
 
std::cout << ymd << std::endl;
}
}
</syntaxhighlight>
{{ out }}
<pre>
The dates of the last Sunday in each month of 2023:
2023-01-29
2023-02-26
2023-03-26
2023-04-30
2023-05-28
2023-06-25
2023-07-30
2023-08-27
2023-09-24
2023-10-29
2023-11-26
2023-12-31
</pre>
 
=={{header|Clojure}}==
 
<langsyntaxhighlight lang="clojure">(ns last-sundays.core
(:require [clj-time.core :as time]
[clj-time.periodic :refer [periodic-seq]]
Line 1,145 ⟶ 1,340:
(defn -main [& args]
(println (last-sundays-of-months (Integer. (first args)))))
</syntaxhighlight>
</lang>
{{out}}
<pre>2013-01-27
Line 1,162 ⟶ 1,357:
 
=={{header|COBOL}}==
<syntaxhighlight lang="cobol">
<lang COBOL>
program-id. last-sun.
data division.
Line 1,211 ⟶ 1,406:
.
end program last-sun.
</syntaxhighlight>
</lang>
 
{{out}}
Line 1,232 ⟶ 1,427:
First, calculate the day of week of the 1st day of next month. Then figure out how many days you have to go back until the last Sunday of the month.
 
<langsyntaxhighlight lang="lisp">(defun last-sundays (year)
(loop for month from 1 to 12
for last-month-p = (= month 12)
Line 1,247 ⟶ 1,442:
(format t "~D-~2,'0D-~2,'0D~%" year month date))))
 
(last-sundays 2013)</langsyntaxhighlight>
{{out}}
<pre>2013-01-27
Line 1,263 ⟶ 1,458:
 
=={{header|D}}==
<langsyntaxhighlight lang="d">void lastSundays(in uint year) {
import std.stdio, std.datetime;
 
Line 1,276 ⟶ 1,471:
void main() {
lastSundays(2013);
}</langsyntaxhighlight>
{{out}}
<pre>2013-Jan-27
Line 1,294 ⟶ 1,489:
{{libheader| System.DateUtils}}
{{Trans|C#}}
<syntaxhighlight lang="delphi">
<lang Delphi>
program Find_the_last_Sunday_of_each_month;
 
Line 1,343 ⟶ 1,538:
 
readln;
end.</langsyntaxhighlight>
 
=={{header|EasyLang}}==
<syntaxhighlight>
func leap year .
return if year mod 4 = 0 and (year mod 100 <> 0 or year mod 400 = 0)
.
func weekday year month day .
normdoom[] = [ 3 7 7 4 2 6 4 1 5 3 7 5 ]
c = year div 100
r = year mod 100
s = r div 12
t = r mod 12
c_anchor = (5 * (c mod 4) + 2) mod 7
doom = (s + t + (t div 4) + c_anchor) mod 7
anchor = normdoom[month]
if leap year = 1 and month <= 2
anchor = (anchor + 1) mod1 7
.
return (doom + day - anchor + 7) mod 7 + 1
.
mdays[] = [ 31 28 31 30 31 30 31 31 30 31 30 31 ]
proc last_sundays year . .
for m to 12
d = mdays[m]
if m = 2 and leap year = 1
d = 29
.
d -= weekday year m d - 1
m$ = m
if m < 10
m$ = "0" & m
.
print year & "-" & m$ & "-" & d
.
.
last_sundays 2023
</syntaxhighlight>
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule RC do
def lastSunday(year) do
Enum.map(1..12, fn month ->
Line 1,360 ⟶ 1,592:
Enum.each(RC.lastSunday(y), fn {year, month, day} ->
:io.format "~4b-~2..0w-~2..0w~n", [year, month, day]
end)</langsyntaxhighlight>
 
{{out}}
Line 1,378 ⟶ 1,610:
2013-12-29
</pre>
 
=={{header|Emacs Lisp}}==
<syntaxhighlight lang="lisp">(require 'calendar)
 
(defun last-sunday (year)
"Print the last Sunday in each month of year"
(mapcar (lambda (month)
(let*
((days (number-sequence 1 (calendar-last-day-of-month month year)))
(mdy (mapcar (lambda (x) (list month x year)) days))
(weekdays (mapcar #'calendar-day-of-week mdy))
(lastsunday (1+ (cl-position 0 weekdays :from-end t))))
(insert (format "%i-%02i-%02i \n" year month lastsunday))))
(number-sequence 1 12)))
 
(last-sunday 2013)</syntaxhighlight>
{{output}}
<pre>2013-01-27
2013-02-24
2013-03-31
2013-04-28
2013-05-26
2013-06-30
2013-07-28
2013-08-25
2013-09-29
2013-10-27
2013-11-24
2013-12-29 </pre>
 
=={{header|Erlang}}==
<syntaxhighlight lang="erlang">
<lang Erlang>
-module(last_sundays).
 
Line 1,395 ⟶ 1,656:
{Year, Month, Ldm - Diff}.
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,421 ⟶ 1,682:
 
{{Works with|Office 365 betas 2021}}
<langsyntaxhighlight lang="lisp">lastSundayOfEachMonth
=LAMBDA(y,
LAMBDA(monthEnd,
Line 1,431 ⟶ 1,692:
)
)
)</langsyntaxhighlight>
{{Out}}
The formula in cell B2 defines an array which populates the range '''B2:B13'''.
Line 1,501 ⟶ 1,762:
<p>We use a transformation from and to the Julian Day Number, see also PARI/GP or Fortran.</p>
<p>The formulars used here come from [http://calendars.wikia.com/wiki/Julian_day_number] (section "Calculation").</p>
<langsyntaxhighlight lang="fsharp">let jdn (year, month, day) =
let a = (14 - month) / 12
let y = year + 4800 - a
Line 1,528 ⟶ 1,789:
|> List.map (fun x -> date_from_jdn (x - (x+1)%7))
|> List.iter (printfn "%A")
0</langsyntaxhighlight>
{{out}}
<pre>RosettaCode 2016
Line 1,546 ⟶ 1,807:
=={{header|Factor}}==
This program expects a year passed in via command line argument. In case you are wondering — yes — Factor has a <tt>last-sunday-of-month</tt> word in its calendar vocabulary. This is par for the course when it comes to Factor.
<langsyntaxhighlight lang="factor">USING: calendar calendar.format command-line io kernel math math.parser
sequences ;
IN: rosetta-code.last-sunday
Line 1,556 ⟶ 1,817:
: main ( -- ) parse-year 12 [ process-month ] times drop ;
 
MAIN: main</langsyntaxhighlight>
{{out}}
<pre>
Line 1,575 ⟶ 1,836:
 
=={{header|FBSL}}==
<langsyntaxhighlight lang="qbasic">#APPTYPE CONSOLE
 
DIM date AS INTEGER, dayname AS STRING
Line 1,592 ⟶ 1,853:
 
PAUSE
</syntaxhighlight>
</lang>
{{out}}
<pre>2013-1-27
Line 1,615 ⟶ 1,876:
Their routine is not only fast, but flexible, in particular allowing Month + 1 so that DAYNUM(Y,M + 1,0) gives the last day of month M for M = 1 to 12, with no agony over which month has what last day and leap years or not. If W is the day of week desired, all that remains is to use MOD(D - W,7) to determine the offset back to the desired day of the week and make that shift. There is a problem with the MOD function when negative numbers are involved: it may or may not (depending on computer, compiler, language) return a negative result; by adding 7 and taking a MOD again, this variation is suppressed.
 
The source uses the MODULE protocol for convenience in its usage in larger projects (which contain a calculation for Easter, daylight savings changeover dates, solar azimuth and altitude, etc. which have been removed here), but requires only F77 features, except for the annoyance of the MUNYAD function returning a TYPE(DATEBAG) result to get the three parts. This is an example where a palindromic programming protocol would be so much better. One would write <langsyntaxhighlight Fortranlang="fortran"> D = DAYNUM(Y,M,D) !Daynumber from date.
DAYNUM(Y,M,D) = D !Date parts from a day number.</langsyntaxhighlight>
But alas, only pl/i offers palindromic functions, and only for SUBSTR.
 
<syntaxhighlight lang="fortran">
<lang Fortran>
MODULE DATEGNASH
C Calculate conforming to complex calendarical contortions.
Line 1,876 ⟶ 2,137:
GO TO 10
END
</syntaxhighlight>
</lang>
And after all that, results:
<pre>
Line 1,898 ⟶ 2,159:
29/12/2013 : Sunday
What year (non-positive to quit):0
</pre>
 
=={{header|Free Pascal}}==
 
<syntaxhighlight lang="pascal">
program sundays;
 
Uses sysutils;
 
type
MonthLength = Array[1..13] of Integer;
 
procedure sund(y : Integer);
var
dt : TDateTime;
m,mm : Integer;
len : MonthLength;
begin
len[1] := 31; len[2] := 28; len[3] := 31; len[4] := 30;
len[5] := 31; len[6] := 30; len[7] := 31; len[8] := 31;
len[9] := 30; len[10] := 31; len[11] := 30; len[12] := 31; len[13] := 29;
for m := 1 to 12 do
begin
mm := m;
if (m = 2) and IsLeapYear( y ) then
mm := 13;
dt := EncodeDate( y, mm, len[mm] );
dt := EncodeDate( y, mm, len[mm] - DayOfWeek(dt) + 1 );
WriteLn(FormatDateTime('YYYY-MM-DD', dt ));
end;
end;
 
var
i : integer;
yy: integer;
begin
for i := 1 to paramCount() do begin
Val( paramStr(1), yy );
sund( yy );
end;
end.
</syntaxhighlight>
 
{{out}}
<pre>
./sundays 2025
2025-01-26
2025-02-23
2025-03-30
2025-04-27
2025-05-25
2025-06-29
2025-07-27
2025-08-31
2025-09-28
2025-10-26
2025-11-30
2025-12-28
</pre>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight FreeBASIClang="freebasic">' version 23-06-2015
' compile with: fbc -s console
 
Line 1,985 ⟶ 2,304:
 
Loop
End</langsyntaxhighlight>
{{out}}
<pre>For what year do you want to find the last Sunday of the month
Line 2,003 ⟶ 2,322:
26 November
31 December</pre>
 
=={{header|Frink}}==
<syntaxhighlight lang="frink">d = parseDate[ARGS@0]
for m = 1 to 12
{
d = beginningOfNextMonth[d]
n = d - parseInt[d -> ### u ###] days
println[n->###yyyy-MM-dd###]
}</syntaxhighlight>
 
{{out}}
<pre>2013-01-27
2013-02-24
2013-03-31
2013-04-28
2013-05-26
2013-06-30
2013-07-28
2013-08-25
2013-09-29
2013-10-27
2013-11-24
2013-12-29
</pre>
 
=={{header|Fōrmulæ}}==
 
{{FormulaeEntry|page=https://formulae.org/?script=examples/Last_day_of_each_month_of_a_year%2C_being_a_given_weekday}}
 
'''Solution'''
 
The following function retrieves the last day of each month of a year, being a given weekday:
 
[[File:Fōrmulæ - Last day of each month of a year, being a given weekday 01.png]]
 
'''Test case'''
 
[[File:Fōrmulæ - Last day of each month of a year, being a given weekday 02.png]]
 
[[File:Fōrmulæ - Last day of each month of a year, being a given weekday 03.png]]
 
 
=={{header|FutureBasic}}==
<syntaxhighlight lang="futurebasic">
Long y, c, d, i
 
void local fn sunday( m as Short, nd as Short)
if d > nd then d -= 7 // Don't overshoot
print y @"–"m @"–"d
d = d + 35 - nd // Advance 5 weeks minus month length
end fn
 
void local fn month( m as Short )
select m
case 1
if ( y mod 4 > 0 ) or ( y mod 100 == 0 and y mod 400 > 0 )
fn sunday( m, 31)
fn sunday( m + 1, 28)
else
d += 1 // Extra day for leap year
fn sunday( m, 31 )
fn sunday( m + 1, 29 )
end if
case 3, 5, 7, 8, 10, 12
fn sunday( m, 31 )
case 4, 6, 9, 11
fn sunday( m, 30 )
end select
end fn
 
y = 2024
// Concentrate from D. Knuth: CACM 1962;5:209
c = y / 100 + 1
d = ( 3 * c / 4 ) - ( 5 * y / 4 )
d = ( d mod 7 ) + 36 // A Sunday in February
for i = 1 to 12
fn month( i )
next
 
handleevents
</syntaxhighlight>
Output:
<pre>
2024-1-28
2024-2-25
2024-3-31
2024-4-28
2024-5-26
2024-6-30
2024-7-28
2024-8-25
2024-9-29
2024-10-27
2024-11-24
2024-12-29
</pre>
 
=={{header|Gambas}}==
<langsyntaxhighlight lang="gambas">Public Sub Form_Open()
Dim sYear As String 'To store the year chosen
Dim siDay, siMonth, siWeekday As Short 'Day, Month and Weekday
Line 2,023 ⟶ 2,438:
Next
 
End</langsyntaxhighlight>
Output:
<pre>
Line 2,045 ⟶ 2,460:
This is different from the Go code for [[Last Friday of each month]]. It uses the fact that time functions in Go correct for dates: if you enter 32nd of october, Go corrects to 1st of November. So that if 29th of February is corrected to 1st of March, chosen year is not a leap year.
 
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,091 ⟶ 2,506:
}
}
</syntaxhighlight>
</lang>
 
<pre>
Line 2,113 ⟶ 2,528:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">enum Day {
Sun, Mon, Tue, Wed, Thu, Fri, Sat
static Day valueOf(Date d) { Day.valueOf(d.format('EEE')) }
Line 2,128 ⟶ 2,543:
!months[monthStr] ? months + [(monthStr):sunday] : months
}.values().sort()
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">def ymd = { it.format('yyyy-MM-dd') }
def lastSundays = lastWeekDays.curry(Day.Sun)
lastSundays(args[0] as int).each { println (ymd(it)) }</langsyntaxhighlight>
 
Execution (Cygwin on Windows 7):
Line 2,153 ⟶ 2,568:
 
=={{header|Haskell}}==
<syntaxhighlight lang="haskell">import Data.List (find, intercalate, transpose)
<lang Haskell>import Data.Time.Calendar
(Day, addDays, fromGregorian, gregorianMonthLength, showGregorian)
import Data.Time.Calendar.WeekDate (toWeekDate)
import Data.List (find, intercalate, transpose)
import Data.Maybe (fromJust)
import Data.Time.Calendar
( Day,
addDays,
fromGregorian,
gregorianMonthLength,
showGregorian,
)
import Data.Time.Calendar.WeekDate (toWeekDate)
 
---------------- LAST SUNDAY OF EACH MONTH ---------------
-- [1 .. 7] for [Mon .. Sun]
findWeekDay :: Int -> Day -> Day
findWeekDay dayOfWeek date =
fromJust $
find
(\x ->
let (_, _, day) = toWeekDate x
in dayOfWeek == day)
((`addDays` date) <$> [-6 .. 0])
 
lastSundayOfEachMonth = lastWeekDayDates 7
weekDayDates :: Int -> Integer -> [String]
weekDayDates dayOfWeek year =
(showGregorian . findWeekDay dayOfWeek) .
(fromGregorian year <*> gregorianMonthLength year) <$>
[1 .. 12]
 
--------------------------- TEST -------------------------
main :: IO ()
main =
mapM_
putStrLn
( intercalate " " <$> transpose (weekDayDates 7 <$> [2013 .. 2017]))</lang>
<$> transpose
(lastSundayOfEachMonth <$> [2013 .. 2017])
)
 
------------------- NEAREST DAY OF WEEK ------------------
 
lastWeekDayDates :: Int -> Integer -> [String]
lastWeekDayDates dayOfWeek year =
(showGregorian . mostRecentWeekday dayOfWeek)
. (fromGregorian year <*> gregorianMonthLength year)
<$> [1 .. 12]
 
mostRecentWeekday :: Int -> Day -> Day
mostRecentWeekday dayOfWeek date =
fromJust
(find p ((`addDays` date) <$> [-6 .. 0]))
where
p x =
let (_, _, day) = toWeekDate x
in dayOfWeek == day</syntaxhighlight>
{{Out}}
<pre>2018-01-28 2019-01-27 2020-01-26 2021-01-31 2022-01-30 2023-01-29
Line 2,198 ⟶ 2,627:
This is a trivial adaptation of the solution to the "Last Friday of each month" task
and works in both languages:
<langsyntaxhighlight lang="unicon">procedure main(A)
every write(lastsundays(!A))
end
Line 2,217 ⟶ 2,646:
end
link datetime, printf</langsyntaxhighlight>
 
Sample run:
Line 2,251 ⟶ 2,680:
=={{header|J}}==
Same solution as for [[Last_Friday_of_each_month#J]]
<langsyntaxhighlight lang="j">require'dates'
last_sundays=: 12 {. [: ({:/.~ }:"1)@(#~ 0 = weekday)@todate (i.366) + todayno@,&1 1</langsyntaxhighlight>
 
Example use:
<langsyntaxhighlight lang="j"> last_sundays 2013
2013 1 27
2013 2 24
Line 2,267 ⟶ 2,696:
2013 10 27
2013 11 24
2013 12 29</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.util.Scanner;
 
public class LastSunday
Line 2,341 ⟶ 2,770:
s.close();
}
}</langsyntaxhighlight>
 
{{out}}
Line 2,362 ⟶ 2,791:
</pre>
===Java 8===
<langsyntaxhighlight Javalang="java">import java.time.*;
import java.util.stream.*;
import static java.time.temporal.TemporalAdjusters.*;
Line 2,390 ⟶ 2,819:
}
 
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
===ES5===
====Iteration====
<langsyntaxhighlight lang="javascript">function lastSundayOfEachMonths(year) {
var lastDay = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
var sundays = [];
Line 2,410 ⟶ 2,839:
}
 
console.log(lastSundayOfEachMonths(2013).join('\n'));</langsyntaxhighlight>
{{output}}
<pre>2013-01-27
Line 2,426 ⟶ 2,855:
 
====Functional composition====
<langsyntaxhighlight JavaScriptlang="javascript">(function () {
'use strict';
 
Line 2,498 ⟶ 2,927:
.join('\n');
 
})();</langsyntaxhighlight>
 
{{Out}}
Line 2,515 ⟶ 2,944:
 
===ES6===
<langsyntaxhighlight JavaScriptlang="javascript">(() => {
'use strict'
 
Line 2,620 ⟶ 3,049:
// MAIN ---
return main();
})();</langsyntaxhighlight>
{{Out}}
<pre>2019-01-27 2020-01-26 2021-01-31 2022-01-30
Line 2,638 ⟶ 3,067:
{{works with|jq|1.4}}
'''Foundations'''
<langsyntaxhighlight lang="jq"># In case your jq does not have "until" defined:
def until(cond; next):
def _until:
Line 2,663 ⟶ 3,092:
| if iso == "iso" or iso == "ISO" then 1 + ((. + 5) % 7)
else . % 7
end ;</langsyntaxhighlight>
'''findLastSundays'''
<langsyntaxhighlight lang="jq"># year and month are numbered conventionally
def findLastSunday(year; month):
def isLeapYear:
Line 2,687 ⟶ 3,116:
 
$year|tonumber|findLastSundays
</syntaxhighlight>
</lang>
'''Example:'''
<langsyntaxhighlight lang="sh">$ jq --arg year 2013 -n -r -f findLastSundays.jq
YEAR: 2013
January 27
Line 2,702 ⟶ 3,131:
October 27
November 24
December 29</langsyntaxhighlight>
 
=={{header|Julia}}==
<syntaxhighlight lang="julia">
<lang Julia>
isdefined(:Date) || using Dates
 
Line 2,731 ⟶ 3,160:
end
end
</syntaxhighlight>
</lang>
 
This code uses the <code>Dates</code> module, which is being incorporated into Julian's standard library with the current development version (<tt>0.4</tt>). I've used <code>isdefined</code> to make this code good for the current stable version (<tt>0.3</tt>) as well as for future releases. If <code>Dates</code> is not installed on your instance of Julian try <code>Pkg.add("Dates")</code> from the <tt>REPL</tt>.
Line 2,762 ⟶ 3,191:
 
=={{header|K}}==
<syntaxhighlight lang="k">
<lang K>
/ List the dates of last Sundays of each month of
/ a given year
Line 2,776 ⟶ 3,205:
main: {[y]; lsd1[y];`0: ,"Dates of last Sundays of ",($y); 12 10#arr}
 
</syntaxhighlight>
</lang>
The output of a session with the above script is given below:
{{out}}
Line 2,801 ⟶ 3,230:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.0.6
 
import java.util.*
Line 2,821 ⟶ 3,250:
}
}
}</langsyntaxhighlight>
Sample input/output:
{{out}}
Line 2,842 ⟶ 3,271:
 
=={{header|Lasso}}==
<langsyntaxhighlight Lassolang="lasso">local(
year = integer(web_request -> param('year') || 2013),
date = date(#year + '-1-1'),
Line 2,862 ⟶ 3,291:
}
}
#lastsu -> join('<br />')</langsyntaxhighlight>
<pre>27 January
24 February
Line 2,878 ⟶ 3,307:
=={{header|Liberty BASIC}}==
This program goes a step further and provides a function definition, NthDayOfMonth(), that returns the date of any occurrence of a day in any given month and year. For example: The third Monday in February, the last Monday in May, the fourth Thursday in November, etc.
<syntaxhighlight lang="lb">
<lang lb>
yyyy=2013: if yyyy<1901 or yyyy>2099 then end
nda$="Lsu"
Line 2,959 ⟶ 3,388:
end select
end function
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,979 ⟶ 3,408:
=={{header|LiveCode}}==
Abstracted version of "last friday of each month". LiveCode dateItem item 7 is day of week. It is numbered 1 (Sunday) to 7 (Saturday).
<langsyntaxhighlight LiveCodelang="livecode">function lastDay yyyy, dayofweek
-- year,month num,day of month,hour in 24-hour time,minute,second,numeric day of week.
convert the long date to dateitems
Line 3,001 ⟶ 3,430:
sort mydays ascending numeric
return mydays
end lastDay</langsyntaxhighlight>Example<syntaxhighlight lang LiveCode="livecode">put lastDay(2013, 1)</langsyntaxhighlight>Output<pre>1 27
2 24
3 31
Line 3,015 ⟶ 3,444:
 
=={{header|Lua}}==
<langsyntaxhighlight Lualang="lua">function isLeapYear (y)
return (y % 4 == 0 and y % 100 ~=0) or y % 400 == 0
end
Line 3,034 ⟶ 3,463:
end
 
lastWeekdays("Sunday", tonumber(arg[1]))</langsyntaxhighlight>
Command line session:
<pre>>lua lastSundays.lua 2013
Line 3,053 ⟶ 3,482:
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">sundays := proc(year)
local i, dt, change, last_days;
last_days := [31,28,31,30,31,30,31,31,30,31,30,31];
Line 3,070 ⟶ 3,499:
end proc;
 
sundays(2013);</langsyntaxhighlight>
{{Out|Output}}
<pre>
Line 3,088 ⟶ 3,517:
 
=={{header|Mathematica}} / {{header|Wolfram Language}}==
<langsyntaxhighlight lang="mathematica">LastSundays[year_] :=
Table[Last@
DayRange[{year, i},
DatePlus[{year, i}, {{1, "Month"}, {-1, "Day"}}], Sunday], {i,
12}]
LastSundays[2013]</langsyntaxhighlight>
{{out}}
<pre>{{2013, 1, 27}, {2013, 2, 24}, {2013, 3, 31}, {2013, 4, 28}, {2013, 5,
Line 3,100 ⟶ 3,529:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">import os, strutils, times
 
const
Line 3,113 ⟶ 3,542:
var date = initDateTime(lastDay, month, year, 0, 0, 0)
date = date - days(DayDiffs[date.weekday])
echo date.format("yyyy-MM-dd")</langsyntaxhighlight>
Sample usage:
<pre>./lastsunday 2013
Line 3,130 ⟶ 3,559:
 
=={{header|OCaml}}==
<syntaxhighlight lang="ocaml">
<lang OCaml>
let is_leap_year y =
(* See OCaml solution on Rosetta Code for
Line 3,172 ⟶ 3,601:
2 -> print_last_sundays( int_of_string (Sys.argv.(1)));
|_ -> invalid_arg "Please enter a year";
</syntaxhighlight>
</lang>
Sample usage:
<pre> ocaml sundays.ml 2013
Line 3,189 ⟶ 3,618:
 
=={{header|Oforth}}==
<langsyntaxhighlight Oforthlang="oforth">import: date
 
: lastSunday(y)
Line 3,196 ⟶ 3,625:
Date newDate(y, m, Date.DaysInMonth(y, m))
while(dup dayOfWeek Date.SUNDAY <>) [ addDays(-1) ] println
] ;</langsyntaxhighlight>
 
{{out}}
Line 3,216 ⟶ 3,645:
=={{header|PARI/GP}}==
 
<langsyntaxhighlight lang="parigp">\\ Normalized Julian Day Number from date
njd(D) =
{
Line 3,240 ⟶ 3,669:
}
 
for (m=1, 12, a=njd([2013,m+1,0]); print(njdate(a-(a+6)%7)))</langsyntaxhighlight>
 
Output:<pre>
Line 3,258 ⟶ 3,687:
 
=={{header|Perl}}==
<langsyntaxhighlight Perllang="perl">#!/usr/bin/perl
use strict ;
use warnings ;
Line 3,271 ⟶ 3,700:
my $ymd = $date->ymd ;
print "$ymd\n" ;
}</langsyntaxhighlight>
{{out}}
<pre>2013-01-27
Line 3,289 ⟶ 3,718:
=={{header|Phix}}==
Requires 0.8.1 (day_of_week() is now ISO 8601 compliant)
<!--<syntaxhighlight lang="phix">(phixonline)-->
<lang Phix>include timedate.e
<span style="color: #008080;">include</span> <span style="color: #000000;">timedate</span><span style="color: #0000FF;">.</span><span style="color: #000000;">e</span>
 
constant SUNDAY=7
<span style="color: #008080;">constant</span> <span style="color: #000000;">SUNDAY</span><span style="color: #0000FF;">=</span><span style="color: #000000;">7</span>
 
procedure showlast(integer dow, integer doy, timedate td)
<span style="color: #008080;">procedure</span> <span style="color: #000000;">showlast</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">dow</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">doy</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">timedate</span> <span style="color: #000000;">td</span><span style="color: #0000FF;">)</span>
td = adjust_timedate(td,timedelta(days:=doy-1))
<span style="color: #000000;">td</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">adjust_timedate</span><span style="color: #0000FF;">(</span><span style="color: #000000;">td</span><span style="color: #0000FF;">,</span><span style="color: #000000;">timedelta</span><span style="color: #0000FF;">(</span><span style="color: #000000;">days</span><span style="color: #0000FF;">:=</span><span style="color: #000000;">doy</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">))</span>
integer {year,month,day} = td
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">month</span><span style="color: #0000FF;">,</span><span style="color: #000000;">day</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">td</span>
while day_of_week(year,month,day)!=dow do day-=1 end while
<span style="color: #008080;">while</span> <span style="color: #7060A8;">day_of_week</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">month</span><span style="color: #0000FF;">,</span><span style="color: #000000;">day</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">dow</span> <span style="color: #008080;">do</span> <span style="color: #000000;">day</span><span style="color: #0000FF;">-=</span><span style="color: #000000;">1</span> <span style="color: #008080;">end</span> <span style="color: #008080;">while</span>
printf(1,"%4d-%02d-%02d\n",{year,month,day})
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%4d-%02d-%02d\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">month</span><span style="color: #0000FF;">,</span><span style="color: #000000;">day</span><span style="color: #0000FF;">})</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
 
procedure last_day_of_month(integer year, integer dow)
<span style="color: #008080;">procedure</span> <span style="color: #000000;">last_day_of_month</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">year</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">dow</span><span style="color: #0000FF;">)</span>
integer doy
<span style="color: #004080;">integer</span> <span style="color: #000000;">doy</span>
timedate first = {year,1,1,0,0,0,0,0}
<span style="color: #000000;">timedate</span> <span style="color: #000000;">first</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #000000;">0</span><span style="color: #0000FF;">}</span>
-- start by finding the 1st of the next month, less 1
<span style="color: #000080;font-style:italic;">-- start by finding the 1st of the next month, less 1</span>
for i=1 to 11 do
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">11</span> <span style="color: #008080;">do</span>
doy = day_of_year(year,i+1,1)-1
<span style="color: #000000;">doy</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">day_of_year</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)-</span><span style="color: #000000;">1</span>
showlast(dow,doy,first)
<span style="color: #000000;">showlast</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dow</span><span style="color: #0000FF;">,</span><span style="color: #000000;">doy</span><span style="color: #0000FF;">,</span><span style="color: #000000;">first</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
-- do December separately, as 1st would be next year
<span style="color: #000080;font-style:italic;">-- do December separately, as 1st would be next year</span>
doy = day_of_year(year,12,31)
<span style="color: #000000;">doy</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">day_of_year</span><span style="color: #0000FF;">(</span><span style="color: #000000;">year</span><span style="color: #0000FF;">,</span><span style="color: #000000;">12</span><span style="color: #0000FF;">,</span><span style="color: #000000;">31</span><span style="color: #0000FF;">)</span>
showlast(dow,doy,first)
<span style="color: #000000;">showlast</span><span style="color: #0000FF;">(</span><span style="color: #000000;">dow</span><span style="color: #0000FF;">,</span><span style="color: #000000;">doy</span><span style="color: #0000FF;">,</span><span style="color: #000000;">first</span><span style="color: #0000FF;">)</span>
end procedure
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
last_day_of_month(2013,SUNDAY)</lang>
<span style="color: #000000;">last_day_of_month</span><span style="color: #0000FF;">(</span><span style="color: #000000;">2013</span><span style="color: #0000FF;">,</span><span style="color: #000000;">SUNDAY</span><span style="color: #0000FF;">)</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
Line 3,330 ⟶ 3,761:
 
=={{header|PHP}}==
<langsyntaxhighlight PHPlang="php"><?php
// Created with PHP 7.0
 
Line 3,345 ⟶ 3,776:
 
printLastSundayOfAllMonth($argv[1]);
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,362 ⟶ 3,793:
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de lastSundays (Y)
(for M 12
(prinl
Line 3,368 ⟶ 3,799:
(find '((D) (= "Sunday" (day D)))
(mapcar '((D) (date Y M D)) `(range 31 22)) )
"-" ) ) ) )</langsyntaxhighlight>
Test:
<langsyntaxhighlight PicoLisplang="picolisp">: (lastSundays 2013)
2013-01-27
2013-02-24
Line 3,382 ⟶ 3,813:
2013-10-27
2013-11-24
2013-12-29</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function last-dayofweek {
param(
Line 3,399 ⟶ 3,830:
}
last-dayofweek 2013 "Sunday"
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 3,419 ⟶ 3,850:
This script finds the first and/or last or all dates of any of the days of week; accepts <code>[Int32]</code> and <code>[DateTime]</code> values for Month and Year parameters; outputs <code>[DateTime]</code> objects by default but has an option to output time strings in various formats. This script also allows for pipeline input based mainly upon the Month parameter.
This script has a syntax as complex as any PowerShell Cmdlet because it attempts to do everything.
<syntaxhighlight lang="powershell">
<lang PowerShell>
function Get-Date0fDayOfWeek
{
Line 3,517 ⟶ 3,948:
}
}
</syntaxhighlight>
</lang>
The default is to return <code>[DateTime]</code> objects:
<syntaxhighlight lang="powershell">
<lang PowerShell>
1..12 | Get-Date0fDayOfWeek -Year 2013 -Last -Sunday
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 3,538 ⟶ 3,969:
</pre>
Return the <code>[DateTime]</code> objects as strings (using the default string format):
<syntaxhighlight lang="powershell">
<lang PowerShell>
1..12 | Get-Date0fDayOfWeek -Year 2013 -Last -Sunday -AsString
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 3,557 ⟶ 3,988:
</pre>
Return the <code>[DateTime]</code> objects as strings (specifying the string format):
<syntaxhighlight lang="powershell">
<lang PowerShell>
1..12 | Get-Date0fDayOfWeek -Year 2013 -Last -Sunday -AsString -Format yyyy-MM-dd
</syntaxhighlight>
</lang>
{{Out}}
<pre>
Line 3,577 ⟶ 4,008:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Procedure LastSundayOfEachMonth(yyyy.i,List lfem.i())
Define dv.i=ParseDate("%yyyy",Str(yyyy)), mv.i=1
NewList d.i()
Line 3,610 ⟶ 4,041:
EndIf
Print("...End")
Input()</langsyntaxhighlight>
{{out}}
<pre>Input Year [ 1971 < y < 2038 ]: 2013
Line 3,629 ⟶ 4,060:
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">
import sys
import calendar
Line 3,643 ⟶ 4,074:
last_sunday = max(week[-1] for week in calendar.monthcalendar(year, month))
print('{}-{}-{:2}'.format(year, calendar.month_abbr[month], last_sunday))
</syntaxhighlight>
</lang>
 
<b>Output</b>:
<syntaxhighlight lang="text">
2013-Jan-27
2013-Feb-24
Line 3,659 ⟶ 4,090:
2013-Nov-24
2013-Dec-29
</syntaxhighlight>
</lang>
 
=={{header|QuickBASIC 4.5}}==
QuickBASIC 4.5 doesn't have a way to manage dates easily. Following you'll see my solution for this task in QuickBASIC/QBASIC
<syntaxhighlight lang="qbasic">
<lang QBASIC>
' PROGRAM Last Sundays in Quick BASIC 4.5 (LASTSQB1)
' This program will calculate the last Sundays of each month in a given year.
Line 3,787 ⟶ 4,218:
 
END FUNCTION
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,809 ⟶ 4,240:
==={{header|VB-DOS 1.0}}===
As VB-DOS uses serial numbers for dates and includes some useful functions to work with dates, it is easier to do this code in VB-DOS.
<syntaxhighlight lang="qbasic">
<lang QBASIC>
OPTION EXPLICIT
 
Line 3,862 ⟶ 4,293:
LastSundayOfMonth = iLSoM
END FUNCTION
</syntaxhighlight>
</lang>
 
{{out}}
Line 3,884 ⟶ 4,315:
=={{header|Quackery}}==
 
<langsyntaxhighlight Quackerylang="quackery"> [ over 3 < if [ 1 - ]
dup 4 / over +
over 100 / -
Line 3,931 ⟶ 4,362:
[ 0 lastwkdays ] is lastsundays ( year --> )
 
2013 lastsundays</langsyntaxhighlight>
 
{{out}}
Line 3,949 ⟶ 4,380:
 
=={{header|R}}==
<langsyntaxhighlight lang="rsplus">
last_sundays <- function(year) {
for (month in 1:12) {
Line 3,964 ⟶ 4,395:
}
last_sundays(2004)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,982 ⟶ 4,413:
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(require srfi/19 math)
Line 4,024 ⟶ 4,455:
(for ([d (last-sundays 2013)])
(displayln (~a (date->string d "~a ~d ~b ~Y"))))
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,045 ⟶ 4,476:
 
{{works with|rakudo|2018.03}}
<syntaxhighlight lang="raku" perl6line>sub MAIN ($year = Date.today.year) {
for 1..12 -> $month {
my $month-end = Date.new($year, $month, Date.new($year,$month,1).days-in-month);
say $month-end - $month-end.day-of-week % 7;
}
}</langsyntaxhighlight>
 
{{out|input=2018}}
Line 4,067 ⟶ 4,498:
 
=={{header|REBOL}}==
<langsyntaxhighlight REBOLlang="rebol">#!/usr/bin/env rebol
 
last-sundays-of-year: function [
Line 4,083 ⟶ 4,514:
 
foreach sunday last-sundays-of-year to-integer system/script/args [print sunday]
</syntaxhighlight>
</lang>
{{out}}
<pre>./last-sundays.reb 2013
Line 4,105 ⟶ 4,536:
except for the innards of the first '''DO''' loop. <br><br>
The &nbsp; '''lastDOW''' &nbsp; subroutine can be used for any day-of-the-week for any month for any year.
<langsyntaxhighlight lang="rexx">/*REXX program displays dates of last Sundays of each month for any year*/
parse arg yyyy
do j=1 for 12
Line 4,183 ⟶ 4,614:
.er: arg ,_;say; say '***error!*** (in LASTDOW)';say /*tell error, and */
say word('day-of-week month year excess',arg(2)) arg(1) a._
say; exit 13 /*... then exit. */</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input &nbsp; (the current year, &nbsp; 2013):}}
<pre>
Line 4,201 ⟶ 4,632:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
see "What year to calculate (yyyy) : "
give year
Line 4,220 ⟶ 4,651:
next
next
</syntaxhighlight>
</lang>
Output:
<pre>
Line 4,237 ⟶ 4,668:
2013-11-24
2013-12-29
</pre>
 
=={{header|RPL}}==
<code>WKDAY</code> is defined at [[Day of the week#RPL|Day of the week]]
{{works with|HP|48}}
≪ → year
≪ { }
.02 .13 '''FOR''' month
1 month .13 == DUP .01 month IFTE SWAP year + 1000000 / + + <span style="color:grey">@ Generate 1st day of the following month</span>
DUP <span style="color:blue">WKDAY</span> NEG DATE+ +
.01 '''STEP'''
2 FIX <span style="color:grey">@ Display October Sunday as ##.10 and not as ##.1</span>
≫ ≫ '<span style="color:blue">LSTSU</span>' STO
 
2013 <span style="color:blue">LSTSU</span>
{{out}}
<pre>
1: { 27.01 24.02 24.03 28.04 26.05 30.06 28.07 25.08 29.09 27.10 24.11 29.12 }
</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">require 'date'
 
def last_sundays_of_year(year = Date.today.year)
Line 4,249 ⟶ 4,698:
end
 
puts last_sundays_of_year(2013)</langsyntaxhighlight>
 
{{out}}
Line 4,269 ⟶ 4,718:
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">input "What year to calculate (yyyy) : ";year
print "Last Sundays in ";year;" are:"
dim month(12)
Line 4,286 ⟶ 4,735:
if x = 4 then print year ; "-";right$("0"+str$(n),2);"-" ; i
next
next</langsyntaxhighlight>
<pre>
What year to calculate (yyyy) : ?2013
Line 4,304 ⟶ 4,753:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">use std::env::args;
use time::{Date, Duration};
 
Line 4,317 ⟶ 4,766:
println!("{}", date - days_back);
});
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,334 ⟶ 4,783:
</pre>
 
=={{header|S-BasicBASIC}}==
<langsyntaxhighlight lang="basic">
rem - computereturn p mod q
function mod(p, q = integer) = integer
end = p - q * (p/q)
Line 4,387 ⟶ 4,836:
d = monthdays(m, y)
w = dayofweek(m, d, y)
rem - findback nearestup prioras occurrenceneeded ofto desired weekday
if w >= k then
d = d - (w - k)
else
d = d - (7 - (k - w))
end = d
 
Line 4,401 ⟶ 4,850:
 
$constant SUNDAY = 0
var m, y = integer
input "Display last Sundays in what year"; y
print "Last Sunday of each month in 2021"
for m = 1 to 12
print shortmonth(m);" ";lastkday(SUNDAY, m, 2021y)
next m
end</syntaxhighlight>
 
end</lang>
{{out}}
<pre>
LastDisplay sundaylast ofSundays eachin monthwhat inyear? 2021
Jan 21
Feb 28
Line 4,425 ⟶ 4,873:
 
=={{header|Scala}}==
<langsyntaxhighlight Scalalang="scala">object FindTheLastSundayOfEachMonth extends App {
import java.util.Calendar._
val cal = getInstance
Line 4,439 ⟶ 4,887:
val fmt = new java.text.SimpleDateFormat("yyyy-MM-dd")
println(lastSundaysOf(year).map(fmt.format) mkString "\n")
}</langsyntaxhighlight>
===Java 8===
<langsyntaxhighlight Scalalang="scala">object FindTheLastSundayOfEachMonth extends App {
def lastSundaysOf(year: Int) = (1 to 12).map{month =>
import java.time._; import java.time.temporal.TemporalAdjusters._
Line 4,448 ⟶ 4,896:
val year = args.headOption.map(_.toInt).getOrElse(java.time.LocalDate.now.getYear)
println(lastSundaysOf(year) mkString "\n")
}</langsyntaxhighlight>
 
=={{header|Seed7}}==
Line 4,455 ⟶ 4,903:
Applicable to any day of the week, cf. [[http://rosettacode.org/wiki/Last_Friday_of_each_month#Seed7]].
 
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
include "time.s7i";
include "duration.s7i";
Line 4,484 ⟶ 4,932:
end for;
end if;
end func;</langsyntaxhighlight>
 
{{out}} when called with <tt>s7 rosetta/lastWeekdayInMonth 7 2013</tt>:
Line 4,503 ⟶ 4,951:
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">var dt = require('DateTime');
var (year=2016) = ARGV.map{.to_i}...
 
Line 4,517 ⟶ 4,965:
 
say date.ymd;
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,536 ⟶ 4,984:
 
=={{header|Smalltalk}}==
<langsyntaxhighlight lang="smalltalk">
Pharo Smalltalk
 
Line 4,546 ⟶ 4,994:
thenSelect: [ :each |
(((Date daysInMonth: each monthIndex forYear: yr) - each dayOfMonth) <= 6) and: [ each year = yr ] ] ]
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 4,554 ⟶ 5,002:
 
=={{header|Stata}}==
<langsyntaxhighlight lang="stata">program last_sundays
args year
clear
Line 4,580 ⟶ 5,028:
| 24nov2013 |
| 29dec2013 |
+-----------+</langsyntaxhighlight>
 
=={{header|Swift}}==
<langsyntaxhighlight Swiftlang="swift">import Foundation
 
func lastSundays(of year: Int) -> [Date] {
Line 4,613 ⟶ 5,061:
dateFormatter.dateStyle = .short
 
print(lastSundays(of: 2013).map(dateFormatter.string).joined(separator: "\n"))</langsyntaxhighlight>
{{out}}
<pre>
Line 4,631 ⟶ 5,079:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">proc lastSundays {{year ""}} {
if {$year eq ""} {
set year [clock format [clock seconds] -gmt 1 -format "%Y"]
Line 4,644 ⟶ 5,092:
return $result
}
puts [join [lastSundays {*}$argv] "\n"]</langsyntaxhighlight>
{{out}}
When called as: “<code>tclsh lastSundays.tcl 2013</code>” (or with the year argument omitted during 2013)
Line 4,667 ⟶ 5,115:
This uses the programs awk and cal, which are usually installed on any POSIXlike system.
 
<langsyntaxhighlight lang="sh">last_sundays() {
local y=$1
for (( m=1; m<=12; ++m )); do
cal $m $y | awk -vy=$y -vm=$m '/^.[0-9]/ {d=$1} END {print y"-"m"-"d}'
done
}</langsyntaxhighlight>
 
{{Out}}
Line 4,691 ⟶ 5,139:
=={{header|VBScript}}==
{{works with|Windows Script Host|*}}
<syntaxhighlight lang="vbscript">
<lang VBScript>
strYear = WScript.StdIn.ReadLine
 
Line 4,698 ⟶ 5,146:
WScript.Echo d - Weekday(d) + 1
Next
</syntaxhighlight>
</lang>
 
=={{header|Wren}}==
{{libheader|Wren-date}}
<langsyntaxhighlight ecmascriptlang="wren">import "os" for Process
import "./date" for Date
var args = Process.arguments
Line 4,722 ⟶ 5,170:
System.print(dt.addDays(-wd))
}
}</langsyntaxhighlight>
 
{{out}}
<pre>
$ wren last_sundayFind_the_last_Sunday_of_each_month.wren 2013
The dates of the last Sundays in the month for 2013 are:
2013-01-27
Line 4,741 ⟶ 5,189:
2013-12-29
 
$ wren last_sundayFind_the_last_Sunday_of_each_month.wren 2020
The dates of the last Sundays in the month for 2020 are:
2020-01-26
Line 4,755 ⟶ 5,203:
2020-11-29
2020-12-27
</pre>
 
=={{header|XPL0}}==
<syntaxhighlight lang="xpl0">func WeekDay(Year, Month, Day); \Return day of week (0=Sun, 1=Mon ... 6=Sat)
int Year, Month, Day; \works for years from 1583 onward
[if Month<=2 then [Month:= Month+12; Year:= Year-1];
return rem((Day-1 + (Month+1)*26/10 + Year + Year/4 + Year/100*6 + Year/400)/7);
];
int Year, Month, LastDay, WD;
[Year:= IntIn(8); \from command line
for Month:= 1 to 12 do
[LastDay:= WeekDay(Year, Month+1, 1) - WeekDay(Year, Month, 28);
if LastDay < 0 then LastDay:= LastDay + 7;
LastDay:= LastDay + 27; \ = number of days in Month
WD:= WeekDay(Year, Month, LastDay);
LastDay:= LastDay - WD;
IntOut(0, Year); ChOut(0, ^-);
if Month < 10 then ChOut(0, ^0); IntOut(0, Month); ChOut(0, ^-);
IntOut(0, LastDay); CrLf(0);
];
]</syntaxhighlight>
 
{{out}}
<pre>
2013-01-27
2013-02-24
2013-03-31
2013-04-28
2013-05-26
2013-06-30
2013-07-28
2013-08-25
2013-09-29
2013-10-27
2013-11-24
2013-12-29
</pre>
 
1,983

edits