Bu sadece bir deneme ama çok pis kod yazdım...:D
Övünmek için söylemiyorum! (yoksa şöyle derdim: çok pis kod yazarım!)
Hemen aşağıdaki ilk işlev çalışsa da çok saçma sapan bir şey oldu. Mutlaka daha kolayı olmalı. Derdim sadece std.datetime (http://dlang.org/phobos/std_datetime.html#.DateTime.date) olanaklarını kullanarak ISO Calendar yapmak istedim:
import std.datetime, std.stdio,
std.range, std.format;
/* takvim.d (9 Mart 2012)
* SysTime => takvimGünleri() => ubyte[]: array [ 28, 1, .. 31 ]
* Date => ayınBiriHangiGün() => DayOfWeek: enum { sun .. mon }
*
*/
auto takvimGünleri(SysTime takvim) {
ubyte[] sonuç;
auto fark = ayınBiriHangiGün(cast(Date)takvim) - 1;
auto ayınSonGünü = takvim.daysInMonth;
auto ay = enumMonth(takvim.month);
ay--;
takvim.month(ay.e);
auto öncekiAyınSonGünü = takvim.daysInMonth;
auto başlangıç = cast(ubyte)(öncekiAyınSonGünü - fark);
foreach(ubyte i; başlangıç..(++öncekiAyınSonGünü)) sonuç ~= i;
foreach(ubyte i; 1..(++ayınSonGünü)) sonuç ~= i;
auto pisKod = sonuç.length;
foreach(ubyte i; 1..(8 - (pisKod%7))) sonuç ~= i;
return sonuç;
}
DayOfWeek ayınBiriHangiGün(Date tarih) {
long roll = cast(long)tarih.day;
tarih.roll!"days"(-(--roll));
auto günü = DateTime(tarih);
return günü.dayOfWeek;
}
auto enumPrint(T)() {
string[] result;
for(T x = T.min; x <= T.max; x++) {
auto value = appender!string();
formattedWrite(value, "%s", x);
result ~= value.data;
}
return result;
}
union enumMonth {
Month e;
struct {
ubyte dizin;
void opUnary(string işleç)() if(işleç == "++") {
if(dizin < e.max) dizin++;
else dizin = e.min;
}
void opUnary(string işleç)() if(işleç == "--") {
if(dizin > e.min) dizin--;
else dizin = e.max;
}
}
string toString() const @property {
return std.conv.to!string(e);
}
}
void main() {
auto bugün = SysTime(DateTime(2013, 2, 1, 1, 1, 1));//Clock.currTime();
bugün.writeln();
writefln("%-(%s%)\n", repeat("_", 52));
writefln("%-(%s\t%)", enumPrint!DayOfWeek);
writefln("%-(%s%)", repeat("=", 52));
foreach(i, gnlr; bugün.takvimGünleri) {
auto ayraç = (i+1) % 7 ? "\t" : "\n";
if(gnlr<10) " ".write();
gnlr.write(ayraç);
}
writeln();
enum Günler { Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, Pazar }
writefln("%-(%s, %)", enumPrint!Günler);
} /*Çıktısı:
2013-Feb-01 01:01:01
____________________________________________________
sun mon tue wed thu fri sat
====================================================
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 1 2
Pazartesi, Salı, Çarşamba, Perşembe, Cuma, Cumartesi, Pazar
*/
Gerçi modül içinde isoWeek() isminde bir işlev var ama işime yarar mı bilmiyorum...
Alıntı:
The ISO 8601 week of the year that this SysTime is in.
Neyse önemli olan basit bir örnek teşkil etmesi. Yani bunun bir de Türkçesini hazırlayıp iki farklı DLL halinde RhS'ye veri veren bir şey yapabilir miyiz diye deneyeceğim. Bu konuyu da şurada aralamıştık: http://ddili.org/forum/thread/1130
Sevgiler, saygılar...
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]