PDA

View Full Version : Đổi 1 ngày dương lịch bất kỳ sang ngày âm lịch


Huynh Anh Tu
17-02-2006, 04:42 PM
Kính chào Quý Anh Chị quan tâm đến đề mục này!

Tôi là thành viên Huynh Anh Tu, 1 thành viên mới vừa đang nhập cách đây vài hôm vì tôi rất thích những chủ đề trong trang web này,
Tôi đang thực hiện một ước mơ mà tôi ấp ủ từ lâu đó là lập trình 1 chương trình xem ngày giờ giống như một cuốn lịch vạn sự, xem tuổi cưới vợ, gả chồng, xem hướng nhà, hương bếp... (tôi đã 52 tuổi, có học qua cử nhân tin học).
Tôi đang bắt đầu công việc lập trình chương trình như đã nói trên hơn 1 tuần qua thôi, phân hệ đầu tiên là thể hiện 1 cuốn lịch có cả ngày Dương lịch và ngày âm lich. Ngày âm lịch gồm cả ngày tháng bằng số và ngày tháng theo can chi. Mỗi khi click chuột vào ngày nào thi hiện thị chi tiết của 1 tờ lịch vạn sự của ngày đó (như các bài lịch vạn sự của bạn thành viên Hoa Hoang Lan). Chương trình được viết bằng ngôn ngữ Borand Delphi 7.0 chạy trên nền Win XP.
Tôi đã xây dựng xong phần Dương lịch từ năm 1500 đến năm 2799 (thế kỷ 16 ~ 26) dưới dạng 1 tờ lịch tháng hiển thị tất cả ngày trong 1 tháng sắp xếp theo tuần lễ từ thứ hai đến chủ nhât (mổi ngày 1 ô). Có thể xem ngày trong tháng bất kỳ, của năm bất kỳ, trong thế kỷ bất kỳ từ TK 16~26.
Công việc tiếp theo là làm sao trong mổi ô ngày Dương lịch hiện thị thêm ngày âm lịch theo số (ví dụ 17/1 tức là ngày 17 tháng giêng AL) ở góc trên và ngày âm lịch theo can chi (ví dụ Giáp Tuất) ở góc dưới. Về năm và tháng theo can chi thì cho hiển thị bên cạnh tháng năm dương lịch trên đầu tờ lich.

Việc đổi 1 ngày dương lịch sang ngày âm lịch theo can chi tôi đang nghiên cứu tài liệu để lập trịnh. Tuy nhiên việc đổi 1 ngày dương lịch sang ngày và tháng âm lịch theo số tôi chưa tìm thấy tài liệu nào nói rõ ràng và cụ thể. Cái mà tôi thấy khó là ngày và tháng âm lịch theo số không hoàn toàn trùng khớp với ngày tháng dương lịch. ví dụ tháng giêng âm lịch có năm lại rơi vào tháng 2 dương lich. ngày 1/1AL cũng không trùng với ngày 1/1 DL. Các năm nhuần lại có 2 tháng AL và không cố định là tháng nào trong năm.
Việc tính toán các sao kiết, hung, tiết khí lại càng phức tạp.

Vì vậy mong các Anh Chị quan tâm hợp tác để có 1 cái gì đó cho mọi người.

Trước mắt Anh Chị có thể giúp tài liệu hoặc giải thuật để đổi ngày dương lịch sang ngày âm lịch theo số. Nếu được vậy xem như là đồng tác giả.
Công việc đòi hỏi rất nhiều thời gian nghiên cứu và lập trình nên rất cần trợ giúp của Anh Chị cùng quan tâm.

Thành thật cám ơn trước các Anh Chị.

Khách Viếng Thăm
17-02-2006, 05:01 PM
Kính gởi chú :
Không biết chú đã xem qua trình đổi lịch của anh Hồ Ngọc Đức chưa ?
http://www.informatik.uni-leipzig.de/~duc/ Chú có thể hỏi giải thuật trực tiếp anh Hồ Ngọc Đức. Cháu đang định viết bằng php nhưng trước mắt phải tập trung viết nhiều chương trình, chắc cũng phải cuối năm mới bắt tay làm được.
Trong thời gian rất gần sắp tới (chờ chỉnh sửa chính tả...), sẽ đăng tải lên cuốn lịch và lịch Việt Nam của giáo sư Hoàng Xuân Hãn. Đây là tài liệu rất hay do anh Hỏa Tinh tặng và chú Thiên Sứ thực hiện phần đánh máy.

Chính Ấn

Quốc Ấn
17-02-2006, 06:26 PM
Rất chân thành cảm ơn anh Huynh Anh Tu, thật sự là rất cảm ơn, thay mặt Ban Điều Hành website và anh chị em hội viên cùng các bạn độc giả của trang web chúc anh và gia đình luôn khoẻ mạnh, gặp nhiều may mắn, để mọi người sẽ có cơ hội được sử dụng những thành quả lao động trí tuệ của anh.
Cách đây không lâu, tôi có đi dự một hội thảo về phong thuỷ do tại Viện Quy Hoạch Nông Thôn và Trường Đại Học Kiến Trúc do một giáo sư Đài Loan thuyết trình tại Hà Nội thì mới thấy rằng các nước xung quanh họ đã tập trung xây dựng được những phần mềm rất mạnh để phục vụ cho việc nghiên cứu những môn lý học Đông Phương và được giảng dạy như một môn học chính thức trong các trường Đại Học. Ở Việt Nam mình vấn đề này hình như vẫn chưa được chú trọng đúng mức, phần lớn là do tự phát bắt nguồn từ sở thích và mong muốn cá nhân muốn cống hiến cho cộng đồng. Ý định của anh thật tốt đẹp và mong rằng không lâu nữa nó sẽ trở thành hiện thực, được xã hội chính thức công nhận.
Nếu kiến thức có thể giúp anh trong công việc, anh cứ thằng thắn đề nghị, Ban Giám Đốc TTNCLH Đông Phương, anh chị em trong BĐH website và các bạn hội viên sẽ nhiệt tình cùng hỗ trợ anh.
Một lần nữa, Cảm ơn anh HUYNH ANH TU!

Huynh Anh Tu
18-02-2006, 06:19 PM
Cam ơn bạn Chính Ấn Rất nhiều. Và cũng cám ơn trang web của Anh Hồ Ngọc Đức

Huynh Anh Tu

Huynh Anh Tu
21-02-2006, 05:36 PM
Kính gửi Anh Quốc Ấn, Quản trị diễn đàn,
Cám ơn Anh đã động viên tôi có thêm ý chí để làm việc mình muốn làm.
Nhờ bạn Chính Ấn (khách viếng thăm) mách cho tôi địa chỉ trang web của Anh Hồ Ngọc Đức nên tôi đã dowload source code đổi ngày dương lịch sang ngày Âm-Dượng. Source code này Anh Đức viết bằng Java. trong khi tôi dang lập trình bằng Delphi 7.0 vì vậy tôi đã nghiên cứu và viết lại theo ngôn ngữ Delphi. Bây giờ đã hoàn tất phần lịch Dương lịch và Âm Dương lich. Đã chạy thử và kiểm tra thấy đúng (ít nhất là trong 2 năm 2005 và 2006)

Việc tiếp theo là làm sao cho khi user click vào bất kỳ ngày nào thì sẽ hiển thị nội dung như 1 tờ lịch vạn sự của ngày ấy, giống như nội dung lịch vạn sự trong diễn dàn này do chị Hoa Hoang Lan viết.

Tôi không có ý thay thế công việc của Chị Hoang Lan, tôi chỉ muốn góp chút sức để việc tra cứu nhanh gọn hơn. Ai muốn xem ngày nào chỉ cấn 1 cái click chuột và thời gian thì rất dài chứ không từng tuần lễ một. (xin lỗi chi Hoàng Lan, chắc là chị không có nhiều thời gian). Dĩ nhiên để được diều đó thì thời gian tiêu tốn cho việc lập trình rất nhiều.

Tôi là người lập trình chứ không rành rẻ về ngày giờ, sao, tiết, các hung vì vậy nếu được sự cho phép của Chi Hoàng Lan, tôi sẽ lấy dữ liệu trong lịch vạn sự từ 1 tháng giêng năm BT tới ngày cuối mà chị Hoang Lan đăng trên diễn đàn này để đưa một cách thủ công vào lịch do tôi viết để là một bản Demo. Rồi gửi lên diễn đàn để các anh chị góp ý và chỉ vẻ thêm.

Nếu ý kiến của tôi được các Anh chị hoan nghênh, tôi mong Anh chị góp ý cho. Nêu những gì tôi muốn làm gây khó khăn cho Anh Chi thì tôi thành thật xin lỗi và rút lui.

Trân trọng,

Huynh Anh Tu

Quốc Ấn
22-02-2006, 10:25 AM
Chúng tôi rất hoan nghênh ý kiến của anh! Nếu anh cần thêm trợ giúp nào khác thì anh cứ lên tiếng, chị hoahoanglan và mọi người sẽ hết lòng trợ giúp anh trong công trình đầy ý nghĩa này.
Cảm ơn anh Huỳnh Anh Tú!

Nho Tan Phi
23-02-2006, 09:53 AM
hôm kia tra thử lịch của HNĐ thấy:

09/01/1975 DL là 28/11 AL

trong khi tra lịch vạn niên lại là ngày 27/11

vẫn thắc mắc: cái nào đúng?

Huynh Anh Tu
04-03-2006, 09:05 AM
hôm kia tra thử lịch của HNĐ thấy:

09/01/1975 DL là 28/11 AL

trong khi tra lịch vạn niên lại là ngày 27/11

vẫn thắc mắc: cái nào đúng?

Gửi bạn Nho Tan Phi

Tớ tra lại lịch của HNĐ trên website của HNĐ thì thấy 09/01/1975 là 27/11AL.
Tuy nhiên Chương trình do tớ viết theo công thức tính của HNĐ thì đúng là ra ngày 28/11. Tôi xem môt chương trình khác cũng là 28/11AL. Cái nào cũng đúng vì theo tài liệi tớ đọc được thì do cách tính múi giờ, trước 30/4/75 miền nam lấy múi giờ +8, miền Bắc lấy múi giờ +7. Không biết lịch vạn niên tính như thế nào thời kỳ trước 1976 (từ năm 1976, Nhà nước thống nhất tính theo múi giờ GMT + 7)

Huynh Anh Tu

VoTri
16-03-2006, 11:02 PM
Anh Tú,

Đây là cách đổi Dương lịch sang Âm lịch

class DuonglichQuaAmlich
{
int year;
int month;
int dayOfMonth;
int dayOfWeek;
int chYear;
int chMonth;
boolean chLeapMonth;
int chDay;
int chYearData[] = {0, 384, 739, 1093, 1477, 1831, 2185, 2569, 2923, 3278,3662, 4017, 4401, 4755, 5109, 5492, 5847, 6201, 6585, 6940,7324, 7678, 8033, 8416, 8770, 9125, 9509, 9863, 10218, 10602,10956, 11340, 11694, 12048, 12432, 12786, 13141, 13525, 13880, 14264,14618, 14972, 15356, 15710, 16064, 16449, 16803, 17158, 17542, 17896,18279, 18633, 18988, 19372, 19727, 20081, 20465, 20819, 21203, 21557,21911, 22295, 22650, 23004, 23389, 23743, 24097, 24481, 24835, 25219,25573, 25928, 26312, 26666, 27021, 27405, 27759, 28142, 28497, 28851,29235, 29590, 29944, 30328, 30683, 31036, 31420, 31775, 32159, 32513,32868, 33252, 33606, 33960, 34344, 34698, 35082, 35436, 35791, 36175,36530, 36884, 37268, 37622, 38006, 38360, 38714, 39098, 39453, 39808,40192, 40546, 40900, 41283, 41638, 42022, 42376, 42731, 43115, 43469,43823, 44207, 44561, 44916, 45300, 45654, 46039, 46393, 46747, 47131,47485, 47839, 48223, 48578, 48962, 49316, 49671, 50055, 50409, 50793,51147, 51502, 51886, 52240, 52594, 52978, 53332, 53686, 54070, 54425,54779, 55163, 55518, 55902, 56256, 56610, 56994, 57348, 57702, 58086,58441, 58796, 59180, 59534, 59918, 60272, 60626, 61010, 61364, 61719,62103, 62458, 62842, 63196, 63550, 63933, 64288, 64642, 65026
};
int chMonthData[] = {0x459444, 0x514444, 0x454410, 0x1456041, 0x511041, 0x444111, 0x1110645, 0x110451, 0x444451, 0x1114464,0x514444, 0x1516410, 0x544410, 0x511044, 0x444911, 0x444115, 0x111114, 0x444591, 0x445111, 0x1165104,0x151104, 0x544411, 0x1141844, 0x141045, 0x444145, 0x1111314, 0x111444, 0x451141, 0x1151124, 0x151104,0x1452411, 0x450411, 0x441045, 0x1104c45, 0x44451, 0x111445, 0x451461, 0x514441, 0x151c104, 0x544104,0x510411, 0x1441911, 0x441114, 0x44514, 0x1114711, 0x145110, 0x544441, 0x1544124, 0x544104, 0x512414,0x110445, 0x441115, 0x1045914, 0x451144, 0x145110, 0x5450c1, 0x151041, 0x114c105, 0x444105, 0x110445,0x443145, 0x444451, 0x111444, 0x1451311, 0x454410, 0x451041, 0x1444125, 0x444111, 0x1118451, 0x110514,0x444451, 0x1114c44, 0x115104, 0x514411, 0x15110c4, 0x511044, 0x464111, 0x444115, 0x111114, 0x446511,0x445111, 0x145104, 0x544611, 0x544411, 0x141044, 0x504195, 0x444145, 0x1119144, 0x111444, 0x451441,0x1151904, 0x451104, 0x450411, 0x1141245, 0x441045, 0x1124445, 0x44451, 0x114451, 0x453441, 0x514441,0x514104, 0x1510611, 0x510411, 0x1641051, 0x441114, 0x44514, 0x116511, 0x145111, 0x545041, 0x1544904,0x544104, 0x510414, 0x441194, 0x441115, 0x1125114, 0x51144, 0x145111, 0x1145841, 0x151041, 0x144105,0x1110645, 0x110445, 0x441145, 0x1111161, 0x111444, 0x1459111, 0x454410, 0x451041, 0x1444905, 0x444111,0x110451, 0x444651, 0x444511, 0x1194444, 0x115104, 0x514411, 0x1513044, 0x511044, 0x1110654, 0x111114,0x444511, 0x1114524, 0x145104, 0x145104, 0x546411, 0x150411, 0x141045, 0x504915, 0x504445, 0x111144,0x445194, 0x451441, 0x1159104, 0x451104, 0x450411, 0x1443045, 0x441045, 0x104445, 0x111945, 0x114451,0x451444, 0x1451124, 0x514104, 0x1518411, 0x510411, 0x441111, 0x1101c51, 0x104514, 0x114511, 0x5144c4,0x545041, 0x1564104, 0x544104, 0x510414, 0x443114, 0x441115, 0x105114, 0x145311, 0x51111 };

private boolean isLeapyear(int i) {
return i % 4 == 0 && (i % 100 != 0 || i % 400 == 0);
};

private int numDayAfterOrigin(int i, int j, int k) {
int dayElapsed[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
int l = i--;
return ((((j <= 2 || !isLeapyear(l) ? 0 : 1) + 365 * i + i / 4) - i / 100) + i / 400 + dayElapsed[j] + k) - 1;
};

private int cal_DayDifference(int i, int j, int k, int N, int T, int nam) {
return numDayAfterOrigin(i, j, k) - numDayAfterOrigin(nam, T, N); };

DuonglichQuaAmlich(int N,int T,int nam)
{
int i = 0;
int j = chYearData.length - 1;
int l = 0;
int j1 = -cal_DayDifference(1881, 1, 30, N, T, nam);
do
{
int k = (i + j) / 2;
if(j1 < chYearData[k])
j = k - 1;
else
i = k + 1;
}

while(j1 != chYearData[j] && i <= j);
chYear = j;
chMonth = 1;
chLeapMonth = false;
j1 -= chYearData[chYear];
l = chMonthData[chYear];
int i1;
while(j1 >= (i1 = 29 + l % 4 % 2))
{
j1 -= i1;
l /= 4;
if(l % 4 < 2)
{
chLeapMonth = false;
chMonth++;
}

else
{
chLeapMonth = true;
}

}
chDay = j1 + 1;
};

int getngay()
{
return chDay; //ngay;
};

int getthang()
{
return chMonth; //thang;
};

int getcan()
{
return (chYear +7) % 10; // can;
};

int getchi()
{
return ((chYear + 5) % 12); // chi;
};

};