Blog của Lê Văn Luật

Đời người thì có hạn mà sự học thì vô hạn!

Thư viện chuyển đổi Âm – Dương lịch viết trên VB, C# (theo thuật toán của Hồ Ngọc Đức)

Chuyển đổi Âm – Dương lịch theo thuật toán của Hồ Ngọc Đức

Mã VB (của Nguyễn Quốc Sản dựa trên thuật toán của Hồ Ngọc Đức)

Download tại đây. (link gốc từ trang của Hồ Ngọc Đức).

Cách sử dụng:

Có thể sử dụng trong Project VB6 hoặc trong Ms Excel, Word,… (dùng VBA).

Chuyển từ dương lịch sang âm lịch

Function Solar2Lunar( _
                    ByVal dd As Long, _
                    ByVal mm As Long, _
                    Optional ByVal yy As Long = 0, _
                    Optional ByVal timeZone As Long = 7) As String

Chuyển đổi từ dương lịch sang âm lịch. Nhận ngày (dd), tháng (mm), năm (yy) và múi giờ (mặc định là Việt Nam, tức GMT+7). Kết quả trả về chuỗi.

Ví dụ:


           MsgBox Solar2Lunar(16, 4, 2013)

Sẽ cho kết quả 7/3/2013 AL

Chuyển từ âm lịch sang dương lịch

Function Lunar2Solar( _
                    ByVal lunarDay As Long, _
                    ByVal lunarMonth As Long, _
                    Optional ByVal lunarYear As Long = 0, _
                    Optional ByVal lunarLeap As Long = 0, _
                    Optional ByVal timeZone As Long = 7) As Date

Chuyển đổi từ âm lịch sang dương lịch. Nhân ngày (lunarDay), tháng (lunarMonth), năm (lunarYear) – mặc định là năm hiện tại, nếu năm âm lịch là năm nhuận thì lunarLeap là 1 – mặc định là 0 tức không nhuận, múi giờ mặc định là GMT+7 (Việt Nam). Kết quả trả về Date.

Ví dụ:


             MsgBox Lunar2Solar(7,3)

Sẽ cho kết quả 16/4/2013

Mã C# (của tôi, LVL, dựa trên bản Javascript của Hồ Ngọc Đức)

Download tại đây. Download về đổi tên file thành AmLich.cs

Lớp LunarDate cho phép lưu trữ ngày âm lịch.

    public class LunarDate
    {
        public int Day { get; set; }
        public int Month { get; set; }
        public int Year { get; set; }
        public bool IsLeapYear { get; set; }

        public LunarDate(){}

        public LunarDate(int day, int month, int year, bool leap)
        {
            Day=day;
            Month=month;
            Year=year;
            IsLeapYear=leap;
        }

        public override string ToString()
        {
            return Day.ToString() + "/" + Month.ToString() + "/" + Year.ToString() + (IsLeapYear?"N":"");
        }

        public DateTime ToSolarDate(int timeZone)
        {
            return LunarYearTools.LunarToSolar(this);
        }

        public DateTime ToSolarDate()
        {
            return ToSolarDate(7);
        }
    }

Phương thức ToString đã thực hiện sẵn. Với một Constructor không có tham số và một có 4 tham số để có thể khởi tạo trực tiếp:


LunarDate d1 = new LunarDate(),
d2 = new LunarDate(7, 3, 2013, false),
d3 = new LunarDate() { Day = 7, Month = 3, Year = 2013, IsLeapYear = false };

MessageBox.Show(d3.ToString()); // Hiển thị 7/3/2013

Chuyển đổi dương lịch – âm lịch

Với kiểu DateTime: phương thức ToLunarDate cho ngày âm lịch tương ứng (kiểu LunarDate)

Với kiểu LunarDate: phương thức ToSolarDate cho ngày dương lịch tương ứng (kiểu DateTime).

Cũng có thể dùng các phương thức SolarToLunar hoặc LunarToSolar của lớp LunarYearTools để chuyển đổi.

    DateTime d = new DateTime(2013, 4, 16);
    LunarDate ld = new LunarDate(7, 3, 2013, false);
    // Dương lịch -> Âm lịch
    LunarDate ld1 = d.ToLunarDate(); // Hoặc ld1 = LunarYearTools.SolarToLunar(d);
    MessageBox.Show(ld1.ToString()); // Hiển thị 7/3/2013
    // Âm lịch -> Dương lịch
    DateTime d1 = ld.ToSolarDate(); // Hoặc d1 = LunarYearTools.LunarToSolar(ld);
    MessageBox.Show(d1.ToString()); // Hiển thị 16/4/2013
Sử dụng Converter trong XAML (WPF)

Converters tải tại đây

<Window x:Class="AmLich.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:AmLich"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:Solar2LunarConverter x:Key="SolarToLunarConverter"/>
        <local:Lunar2SolarConverter x:Key="LunarToSolarConverter"/>
    </Window.Resources>
    <Grid>
        <StackPanel Orientation="Vertical">
            <DatePicker Margin="5" Name="dtpNgayDL1" SelectedDate="2013-04-16"/>
            <TextBlock Margin="5" Name="tblNgayAL" Tag="{Binding SelectedDate, Converter={StaticResource SolarToLunarConverter}, ElementName=dtpNgayDL1}" Text="{Binding Tag, RelativeSource={RelativeSource Self}}" />
            <DatePicker Margin="5" Name="ddtpNgayDL2" SelectedDate="{Binding Tag, Converter={StaticResource LunarToSolarConverter}, ElementName=tblNgayAL}"/>
        </StackPanel>
    </Grid>
</Window>

7 comments on “Thư viện chuyển đổi Âm – Dương lịch viết trên VB, C# (theo thuật toán của Hồ Ngọc Đức)

  1. HuaHung
    19/04/2013

    Cám ơn thầy bài viết về Âm Dương Lịch, tôi cũng vừa download xong một số files từ trang web của Hồ Ngọc Đức, có lẽ phải chịu khó “ngâm cứu” một chút vì lâu lắm rồi mới đọc “chay” những bài “coding” thế này.

  2. Khách
    15/06/2014

    Thầy ơi, cho em hỏi code âm lịch c# em dùng hàm của thầy, đều đúng với những năm trước đó và sau năm 2014. nhưng năm 2014 thì ngày âm nó lại hơn 1 ngày so với lịch hiện tại, em xem rồi nhưng không biết vì vấn đề gì. Cảm ơn thầy

    • lvluat
      16/06/2014

      Tôi chưa có dịp kiểm tra lại. Có lẽ vài bữa nữa tôi sẽ kiểm tra. Cảm ơn bạn đã báo cho tôi biết!

  3. Trần Minh Tú
    21/10/2014

    Em chào Thầy.
    Thầy cho em hỏi, năm 2014 có nhuận 2 tháng 9, nhưng trong code của thầy lịch lại chuyển sang tháng 10. thầy kiểm tra lại chỗ này đi ạ

    • lvluat
      23/10/2014

      Năm 2014 đâu có nhuận dương lịch bạn?

      Xin lỗi tôi không đọc kỹ câu hỏi của bạn! Có lẽ code này có vấn đề nhưng thời gian này tôi bận quá không xem lại được!

  4. Vuong Long
    10/11/2014

    CHÀO THẦY EM ĐẢ SÀI THỬ NHƯNG MÃ VB CHẠY SAI VÍ DỤ NHƯ DƯƠNG LỊCH 13/3/1982 MÀ ĐỔI SANG ÂM LỊCH LÀ 18/1/1982 LA SAI PHAI LA 18/2/1982 MỚI ĐỨNG

  5. Vuong nguyen long
    10/11/2014

    CHÀO THẦY EM ĐẢ SÀI THỬ NHƯNG MÃ VB CHẠY SAI VÍ DỤ NHƯ DƯƠNG LỊCH 13/3/1982 MÀ ĐỔI SANG ÂM LỊCH LÀ 18/1/1982 LA SAI PHAI LA 18/2/1982 MỚI ĐỨNG

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

Information

This entry was posted on 16/04/2013 by in Lập trình C# & WPF and tagged , , , .

Điều hướng

%d bloggers like this: