On Tuesday, 10 January 2023 at 03:18:54 UTC, matheus wrote:
The layout isn't like yours, I wrote this using a D Online
compiler and I'm very sleepy right now:
```d
import std.stdio, std.string, std.conv, std.datetime;
bool validDate(int y,int m,int d){
try{
Date(y,m,d);
return true;
}catch(Exception e){}
return false;
}
void main(){
int[string] dow;
int i, y = 2023, m = 1, d = 1;
for(i=1;i<8;++i){
dow[to!string(Date(1899,1,i).dayOfWeek)]=i;
}
for(m=1;m<13;++m){
write("\n\n\t\t",capitalize(to!string(Date(y,m,1).month)),"\n");
for(i=1;i<8;++i){
write(to!string(Date(1899,1,i).dayOfWeek)[0..2], " ");
}
writeln();
int c = dow[to!string(Date(y,m,1).dayOfWeek)];
for(i=1;i<c;++i){ write(" "); }
for(d=0;d<32;++d){
if(c%8==0){c=1;writeln();}
++c;
if(validDate(y,m,d+1)){
writef("%2s ",d+1);
}
}
}
}
```
You don't need validDate. Because there is daysInMonth:
```d
writeln();
const date = Date(y, m, 1);
int c = dow[to!string(date.dayOfWeek)];
for(i = 1; i < c; ++i)
write(" ");
for(d = 0; d < 32; ++d)
{
if(++c % 9 == 0)
{
writeln();
c = 2;
}
if(d < date.daysInMonth)
writef("%2s ", d + 1);
}
```
SDB@79