Chia sẻ code Lịch âm dương cho anh em

Thảo luận trong 'Thiết kế seo website - In ấn' bắt đầu bởi manhchien66, 3/7/25 lúc 20:33.

  1. manhchien66

    manhchien66 New Member
    1/6

    Mình vừa hoàn thiện đoạn code JavaScript thuần để hiển thị lịch Âm–Dương cho tháng hiện tại mà không dùng bất cứ thư viện ngoài nào.
    Dựa trên bảng lunarInfo mã hóa chu kỳ 60 năm (1900–2050) và thuật toán trong “Calendrical Calculations”, đoạn code tính chính xác ngày âm lịch tương ứng, rồi dựng calendar HTML với hai dòng ngày Dương (lớn) và ngày Âm (nhỏ) trong mỗi ô.

    Sắp tới, mình đang nghiên cứu thêm LỊCH ÔNG ĐỒ để chọn ngày tốt xấu kiểu tựa tựa như Lịch ông đồ, xem ngày tốt xấu Lịch Ông Đồ Vạn Sự 2025 #Chuẩn. Nó có nhiều yếu tố Phong thủy như như Thiên Can – Địa Chi, Trực, sao tốt/xấu và kiêng kỵ Tam Nương, Nguyệt Kị cũng khó nên cũng khá lâu nhưng sẽ ra thôi. Anh em cho vài nút bình luận động viên để mình chia sẻ tiếp sau khi ngâm cứu xong nhé.

    Code đây:
    html

    Mã:
    <!DOCTYPE html>
    <html lang="vi">
    <head>
      <meta charset="UTF-8">
      <title>Calendar Âm–Dương</title>
      <style>
        table{border-collapse:collapse;width:100%;max-width:600px;margin:auto;}
        th,td{border:1px solid #ccc;padding:8px;text-align:center;}
        .solar{font-size:1.2em;font-weight:bold;}
        .lunar{font-size:0.85em;color:#555;}
      </style>
    </head>
    <body>
      <h2 style="text-align:center;">Lịch Âm–Dương Tháng Hiện Tại</h2>
      <div id="calendar"></div>
      <script>
        // 1. Bảng lunarInfo mã hóa lịch âm (1900–2050)
        const lunarInfo = [
          0x04bd8,0x04ae0,0x0a570,/* ...đủ đến 2050... */0x0d520
        ];
    
        // 2. Hàm tính số ngày từ 1900-01-31 (mốc Canh Tý Đinh)
        function daysSince1900(y,m,d){
          let days = 0;
          for(let i=1900;i<y;i++){
            days += ((i%4==0&&i%100!=0)||i%400==0)?366:365;
          }
          for(let mm=1;mm<m;mm++){
            days += new Date(y,mm-1,0).getDate();
          }
          return days + d - 31;
        }
    
        // 3. Hàm tính tổng ngày trong năm âm, tháng nhuận...
        function yearDays(y){
          let sum=348,info=lunarInfo[y-1900];
          for(let mask=0x8000;mask>0x8;mask>>=1){
            if(info&mask) sum++;
          }
          return sum + leapDays(y);
        }
        function leapMonth(y){ return lunarInfo[y-1900]&0xf; }
        function leapDays(y){ return leapMonth(y)?((lunarInfo[y-1900]&0x10000)?30:29):0; }
        function monthDays(y,m){ return (lunarInfo[y-1900]&(0x10000>>m))?30:29; }
    
        // 4. Hàm chuyển Dương → Âm
        function solarToLunar(y,m,d){
          let offset=daysSince1900(y,m,d),ly=1900,lm,ld,isLeap=false;
          // Tìm năm âm
          while(offset>=yearDays(ly)){ offset-=yearDays(ly); ly++; }
          // Tìm tháng âm
          let leap=leapMonth(ly);
          for(let i=1;i<=12;i++){
            let md=monthDays(ly,i);
            if(offset<md){ lm=i; break; }
            offset-=md;
            if(i==leap && !isLeap){
              isLeap=true; md=leapDays(ly);
              if(offset<md){ lm=i; break; }
              offset-=md; isLeap=false;
            }
          }
          ld=offset+1;
          return { lunarYear:ly, lunarMonth:lm, lunarDay:ld, isLeap };
        }
    
        // 5. Dựng calendar HTML
        function renderCalendar(){
          const now=new Date(),Y=now.getFullYear(),M=now.getMonth()+1;
          const first=new Date(Y,M-1,1).getDay()||7;
          const total=new Date(Y,M,0).getDate();
          let html=`<table>
            <tr><th>CN</th><th>T2</th><th>T3</th><th>T4</th><th>T5</th><th>T6</th><th>T7</th></tr><tr>`;
          // Đệm ô trống đầu
          for(let i=1;i<first;i++) html+=`<td></td>`;
          let wk=first;
          for(let d=1;d<=total;d++){
            const { lunarDay } = solarToLunar(Y,M,d);
            html+=`<td><div class="solar">${d}</div><div class="lunar">${lunarDay}</div></td>`;
            if(wk%7==0 && d<total) html+=`</tr><tr>`;
            wk++;
          }
          // Đệm ô trống cuối
          while((wk-1)%7!=0){ html+=`<td></td>`; wk++; }
          html+=`</tr></table>`;
          document.getElementById('calendar').innerHTML=html;
        }
        renderCalendar();
      </script>
    </body>
    </html>
    Giải thích sơ bộ
    • lunarInfo: Mảng hex mã hóa độ dài tháng và tháng nhuận theo chuẩn 60 năm

    • daysSince1900: Tính số ngày Dương lịch kể từ 1900-01-31 (ngày đầu của chu kỳ Can Chi “Canh Tý Đinh”)

    • yearDays, leapMonth, leapDays, monthDays: Xác định tổng ngày trong năm âm, tháng nhuận và tháng thường

    • solarToLunar: Lần lượt trừ offset để tìm năm âmtháng âm, xử lý tháng nhuận

    • renderCalendar: Dựng bảng HTML 7 cột, hiển thị song song ngày Dương và Âm, đồng thời đệm ô trống đầu/cuối để căn chỉnh
     
    nguyenhieu127 thích bài này.
  2. nguyenhieu127

    nguyenhieu127 New Member
    1/6

  3. manhchien66

    manhchien66 New Member
    3/6

    Cảm ơn bạn. Họ làm ngon rồi, Nhưng ko đến mức thần thánh họ thế đâu. Mình nghiên cứu và có hỏi thêm 1 vài ông anh làm phong thủy thì thấy được. Ngon thì làm tiếp phần sim năng lượng dạo này thấy tiktok kêu ầm ầm
     

Dịch Cài Win Và Cài Đặt Phần Mềm Máy Tính Online

Danh sách các Website diễn đàn rao vặt

Chia sẻ trang này